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库中的函数。