【開發實錄】在鴻蒙開發板上使用websocket(移植自librws庫)
librws: Tiny, cross platform websocket client C library
相關程式碼可在下面下載,也可進入librws: 將librws移植到鴻蒙Hi_3861開發板上 (gitee.com)檢視
技術有限,如有錯誤還望不吝賜教。
基礎:完成官方的快速入門教程
雖然在web雙向通訊中,除了使用ajax(單向輪詢)外,一般都推薦websocket,但網上關於websocket的實現程式碼很少,而且大部分為js和java,很少有C語言。因為課程專案開發需要使用到websocket,就在網上尋找了挺久的,終於找到了這個庫。相對於其他庫來說,這個庫需要跨平臺的程式碼都用了一層適配層,而且沒有用到其他例如libevent等其他庫,用他的話說就是"No additional dependecies",所以移植挺方便的。然後因為這個庫除了windows平臺外,其他平臺都是使用POSIX介面,而Hi_3861上只有POSIX的宣告,但並沒有實現(詳細可看
這篇文章主要介紹如何使用,下一篇可能會介紹如何移植,大家有需求的話,可先學習連志安老師的如何在鴻蒙系統中移植 Paho-MQTT 實現MQTT協議-鴻蒙HarmonyOS技術社群-官方戰略合作伙伴-51CTO.COM文章,這篇文章有挺大的參考價值的。
1、向專案中匯入此庫
下載下面的librws資源放至//third_party目錄下,然後在//vendor/hisi/hi3861/hi3861/BUILD.gn檔案中的lite_component(“sdk”)–>deps下新增 “//third_party/librws:librws_static” 這樣就可以在下次編譯時將相關程式碼編譯成庫放進專案內了。
2、編寫應用程式碼
先使用板子連線上wifi,具體操作可檢視Hi3861 WiFi操作,熱點連線-鴻蒙HarmonyOS技術社群-官方戰略合作伙伴-51CTO.COM,需要注意,連線WiFi後要sleep一段時間。下面資源有相關程式碼。
然後配置相關資訊
rws_socket _socket = NULL; _socket = rws_socket_create(); rws_socket_set_scheme(_socket, "ws"); rws_socket_set_host(_socket, "192.168.1.103"); rws_socket_set_port(_socket, 7777); rws_socket_set_path(_socket, "/ws");
注意配置資訊一定要對應真實資訊,下面我會分享我的websocket服務端測試程式碼。
然後配置回撥函式
// 因主動或者出現錯誤時,斷開連線的回撥函式
static void on_socket_disconnected(rws_socket socket) {
// process error
rws_error error = rws_socket_get_error(socket);
if (error) {
printf("Socket disconnect with code, error: %i, %s\n", rws_error_get_code(error), rws_error_get_description(error));
}
// forget about this socket object, due to next disconnection sequence
socket = NULL;
}
// 建立連結完成後的回撥函式
static void on_socket_connected(rws_socket socket) {
(void) socket;
printf("Socket connected\n");
}
// 接受到資訊的回撥函式
static void on_socket_received_text(rws_socket socket, const char * text, const unsigned int length) {
(void) socket;
char *buff[128] = {0};
memcpy_s(buff, 128, text, length);
printf("Socket text: %s\n", buff);
}
// 設定回撥函式
rws_socket_set_on_disconnected(_socket, &on_socket_disconnected); // required
rws_socket_set_on_connected(_socket, &on_socket_connected);
rws_socket_set_on_received_text(_socket, &on_socket_received_text);
需要注意一個地方,在接受資訊回撥函式中,原倉庫的測試程式碼是直接列印text,但測試發現,text變數除了接受到的資訊還會包括一部分亂碼,所以使用了memcpy_s函式複製有效的資訊在列印。大家編寫接受回撥函式時需要注意這個地方。
接下來就是連線,傳送訊息以及關閉了
printf("[RWS]ready to connect\n");
rws_bool res = rws_socket_connect(_socket);
if(res == rws_false) {
printf("[RWS]error connect\n");
exit(1);
}
sleep(2);
const char * example_text = "hello world";
printf("[RWS]ready to send msg\n");
rws_socket_send_text(_socket, example_text);
sleep(2);
printf("[RWS]ready to disconnect\n");
rws_socket_disconnect_and_release(_socket);
_socket = NULL;
return;
3、測試程式碼
伺服器程式碼使用的是golang,詳細程式碼在下方下載。在程式碼檔案當前目錄執行命令:
go run server.go
4、其他文章
作者:OSAaaa
想了解更多內容,請訪問:
51CTO和華為官方戰略合作共建的鴻蒙技術社群
https://harmonyos.51cto.com#bky