苗火 Nicholas
[c]mosquitto编码实现websockets协议
2016-10-20 萧


mosquitto虽然本身是支持websockets协议的,但却依懒libwebsockets库,而libwebsockets库是基于poll的,所以如果想把mosquitto改为epoll模式很容易,却不能兼容websockets了。



为了解决这个纠结的问题,这几天把websockets协议用C语言重新实现了一遍,然后将mosquitto中调用libwebsockets的部分用自己的代码取代,今天终于实现了websockets下的mqtt通讯功能。



首先一些websockets的结构放在websockets.h中:



typedef struct _WebSocketMark {
BYTE fin:1;
BYTE rsv1:1;
BYTE rsv2:1;
BYTE rsv3:1;
BYTE opcode:4;
BYTE mask:1;
BYTE payloadlen:7;
} WSMark;
typedef struct _WebSocketHeader {
WSMark mark;
UINT64 reallength;
unsigned char mask[4];
unsigned short headlength;
} WSHeader;








然后一些功能函数的实现放在websockets.c中:



int shakeHands(const char* data, char* request);
int parsePack(unsigned char* buf, size_t length, WSHeader* header);
int packData(const unsigned char* message, size_t len, BYTE fin, BYTE opcode, BYTE mask, unsigned char** send, size_t* slen);
int getPackPayloadData(const int cfd, const unsigned char* buf, size_t bufsize, unsigned char* container, const WSHeader* pHeader);



然后是mosquitto中将websockets端口的监听部分放到mqtt中去,原作是在此处调用libwebsockets库中的初始化函数而不暴露新建的socket。







然后是mosquitto中有一个主循环叫mosquitto_main_loop,在这个里面会处理接收到的消息,需要增加websockets的消息处理,原作是在此处调用libwebsockets库中的函数。









发表评论:
昵称

邮件地址 (选填)

个人主页 (选填)

内容