xref: /OK3568_Linux_fs/external/rkwifibt-app/test/rk_ble_app.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun #include <stdio.h>
2*4882a593Smuzhiyun #include <unistd.h>
3*4882a593Smuzhiyun #include <stdlib.h>
4*4882a593Smuzhiyun #include <string.h>
5*4882a593Smuzhiyun #include <stdbool.h>
6*4882a593Smuzhiyun #include <linux/prctl.h>
7*4882a593Smuzhiyun #include <sys/signalfd.h>
8*4882a593Smuzhiyun #include <sys/socket.h>
9*4882a593Smuzhiyun #include <sys/stat.h>
10*4882a593Smuzhiyun #include <sys/un.h>
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun #include <Rk_wifi.h>
13*4882a593Smuzhiyun #include <RkBtBase.h>
14*4882a593Smuzhiyun #include <RkBle.h>
15*4882a593Smuzhiyun 
16*4882a593Smuzhiyun #include "rk_ble_app.h"
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun /* Immediate wifi Service UUID */
19*4882a593Smuzhiyun #define BLE_UUID_SERVICE	"0000180A-0000-1000-8000-00805F9B34FB"
20*4882a593Smuzhiyun #define BLE_UUID_WIFI_CHAR	"00009999-0000-1000-8000-00805F9B34FB"
21*4882a593Smuzhiyun #define BLE_UUID_PROXIMITY	"7B931104-1810-4CBC-94DA-875C8067F845"
22*4882a593Smuzhiyun 
23*4882a593Smuzhiyun #define UUID_MAX_LEN 36
24*4882a593Smuzhiyun 
25*4882a593Smuzhiyun typedef enum {
26*4882a593Smuzhiyun 	RK_BLE_WIFI_State_IDLE = 0,
27*4882a593Smuzhiyun 	RK_BLE_WIFI_State_CONNECTTING,
28*4882a593Smuzhiyun 	RK_BLE_WIFI_State_SUCCESS,
29*4882a593Smuzhiyun 	RK_BLE_WIFI_State_FAIL,
30*4882a593Smuzhiyun 	RK_BLE_WIFI_State_WRONGKEY_FAIL,
31*4882a593Smuzhiyun 	RK_BLE_WIFI_State_DISCONNECT
32*4882a593Smuzhiyun } RK_BLE_WIFI_State_e;
33*4882a593Smuzhiyun 
34*4882a593Smuzhiyun const char *MSG_BLE_WIFI_LIST_FORMAT = "{\"cmd\":\"wifilists\", \"ret\":%s}";
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun static unsigned char rk_wifi_list_buf[20 * 1024];
37*4882a593Smuzhiyun static int scanr_len = 0, scanr_len_use = 0;
38*4882a593Smuzhiyun 
39*4882a593Smuzhiyun static pthread_t wificonfig_tid = 0;
40*4882a593Smuzhiyun static pthread_t wificonfig_scan_tid = 0;
41*4882a593Smuzhiyun 
42*4882a593Smuzhiyun static char wifi_ssid[256];
43*4882a593Smuzhiyun static char wifi_password[256];
44*4882a593Smuzhiyun 
45*4882a593Smuzhiyun static unsigned int ble_mtu = 0;
46*4882a593Smuzhiyun 
47*4882a593Smuzhiyun struct wifi_config {
48*4882a593Smuzhiyun 	char ssid[512];
49*4882a593Smuzhiyun 	int ssid_len;
50*4882a593Smuzhiyun 	char psk[512];
51*4882a593Smuzhiyun 	int psk_len;
52*4882a593Smuzhiyun 	char key_mgmt[512];
53*4882a593Smuzhiyun 	int key_len;
54*4882a593Smuzhiyun 	bool hide;
55*4882a593Smuzhiyun 	void (*wifi_status_callback)(int status, int reason);
56*4882a593Smuzhiyun };
57*4882a593Smuzhiyun 
58*4882a593Smuzhiyun static struct wifi_config wifi_cfg;
59*4882a593Smuzhiyun typedef int (*RK_blewifi_state_callback)(RK_BLE_WIFI_State_e state);
60*4882a593Smuzhiyun 
61*4882a593Smuzhiyun #define RK_BLE_DATA_CMD_LEN      12
62*4882a593Smuzhiyun #define RK_BLE_DATA_SSID_LEN     32
63*4882a593Smuzhiyun #define RK_BLE_DATA_PSK_LEN      32
64*4882a593Smuzhiyun 
65*4882a593Smuzhiyun /* 消息开头必须为0x01,结尾必须为0x04 */
66*4882a593Smuzhiyun typedef struct {
67*4882a593Smuzhiyun 	unsigned char start;               // 段, 01Byte, 固定为 0x01
68*4882a593Smuzhiyun 	char cmd[RK_BLE_DATA_CMD_LEN];     // 段, 12Byte, 值为:"wifisetup"、"wifilists"
69*4882a593Smuzhiyun 	char ssid[RK_BLE_DATA_SSID_LEN];   // 段, 32Byte, 需要连接的 WiFi ssid, 长度不足 32 的部分填充 0
70*4882a593Smuzhiyun 	char psk[RK_BLE_DATA_PSK_LEN];     // 段, 32Byte, 需要连接的 wifi password, 长度不足 32 的部分填充 0
71*4882a593Smuzhiyun 	//unsigned char end;               // 段, 01Byte, 固定位 0x04
72*4882a593Smuzhiyun } RockChipBleData;
73*4882a593Smuzhiyun 
74*4882a593Smuzhiyun typedef struct {
75*4882a593Smuzhiyun 	uint8_t data[6];
76*4882a593Smuzhiyun } mac_t;
77*4882a593Smuzhiyun 
78*4882a593Smuzhiyun typedef struct {
79*4882a593Smuzhiyun 	uint8_t data[16];
80*4882a593Smuzhiyun } uuid128_t;
81*4882a593Smuzhiyun 
_rk_ble_status_cb(const char * bd_addr,const char * name,RK_BLE_STATE state)82*4882a593Smuzhiyun void _rk_ble_status_cb(const char *bd_addr, const char *name, RK_BLE_STATE state)
83*4882a593Smuzhiyun {
84*4882a593Smuzhiyun 	switch (state) {
85*4882a593Smuzhiyun 		case RK_BLE_STATE_IDLE:
86*4882a593Smuzhiyun 			printf("[RK] ble status: RK_BLE_STATE_IDLE\n");
87*4882a593Smuzhiyun 			break;
88*4882a593Smuzhiyun 		case RK_BLE_STATE_CONNECT:
89*4882a593Smuzhiyun 			printf("[RK] ble status: RK_BLE_STATE_CONNECT\n");
90*4882a593Smuzhiyun 			break;
91*4882a593Smuzhiyun 		case RK_BLE_STATE_DISCONNECT:
92*4882a593Smuzhiyun 			printf("[RK] ble status: RK_BLE_STATE_DISCONNECT\n");
93*4882a593Smuzhiyun 			ble_mtu = 0;
94*4882a593Smuzhiyun 			break;
95*4882a593Smuzhiyun 	}
96*4882a593Smuzhiyun }
97*4882a593Smuzhiyun 
_rk_ble_mtu_callback(const char * bd_addr,unsigned int mtu)98*4882a593Smuzhiyun static void _rk_ble_mtu_callback(const char *bd_addr, unsigned int mtu)
99*4882a593Smuzhiyun {
100*4882a593Smuzhiyun 	printf("=== %s: bd_addr: %s, mtu: %d ===\n", __func__, bd_addr, mtu);
101*4882a593Smuzhiyun 	ble_mtu = mtu;
102*4882a593Smuzhiyun }
103*4882a593Smuzhiyun 
rk_blewifi_state_callback(RK_WIFI_RUNNING_State_e state,RK_WIFI_INFO_Connection_s * info)104*4882a593Smuzhiyun static int rk_blewifi_state_callback(RK_WIFI_RUNNING_State_e state, RK_WIFI_INFO_Connection_s *info)
105*4882a593Smuzhiyun {
106*4882a593Smuzhiyun 	uint8_t ret = 0;
107*4882a593Smuzhiyun 
108*4882a593Smuzhiyun 	printf("[RK] %s state: %d\n", __func__, state);
109*4882a593Smuzhiyun 	switch(state) {
110*4882a593Smuzhiyun 		case RK_WIFI_State_CONNECTED:
111*4882a593Smuzhiyun 			ret = 0x1;
112*4882a593Smuzhiyun 			break;
113*4882a593Smuzhiyun 		case RK_WIFI_State_CONNECTFAILED:
114*4882a593Smuzhiyun 		case RK_WIFI_State_CONNECTFAILED_WRONG_KEY:
115*4882a593Smuzhiyun 			ret = 0x2;
116*4882a593Smuzhiyun 			break;
117*4882a593Smuzhiyun 	}
118*4882a593Smuzhiyun 
119*4882a593Smuzhiyun 	if(ret)
120*4882a593Smuzhiyun 		rk_ble_write(BLE_UUID_WIFI_CHAR, &ret, 0x1);
121*4882a593Smuzhiyun 
122*4882a593Smuzhiyun 	return 0;
123*4882a593Smuzhiyun }
124*4882a593Smuzhiyun 
rk_config_wifi_thread(void)125*4882a593Smuzhiyun static void *rk_config_wifi_thread(void)
126*4882a593Smuzhiyun {
127*4882a593Smuzhiyun 	printf("[RK] rk_config_wifi_thread\n");
128*4882a593Smuzhiyun 
129*4882a593Smuzhiyun 	prctl(PR_SET_NAME,"rk_config_wifi_thread");
130*4882a593Smuzhiyun 
131*4882a593Smuzhiyun 	RK_wifi_register_callback(rk_blewifi_state_callback);
132*4882a593Smuzhiyun 	RK_wifi_enable(0);
133*4882a593Smuzhiyun 	RK_wifi_enable(1);
134*4882a593Smuzhiyun 	RK_wifi_connect(wifi_cfg.ssid, wifi_cfg.psk);
135*4882a593Smuzhiyun 	return NULL;
136*4882a593Smuzhiyun }
137*4882a593Smuzhiyun 
rk_ble_send_data(void)138*4882a593Smuzhiyun static void rk_ble_send_data(void)
139*4882a593Smuzhiyun {
140*4882a593Smuzhiyun 	int len, send_max_len = BT_ATT_DEFAULT_LE_MTU;
141*4882a593Smuzhiyun 	uint8_t *data;
142*4882a593Smuzhiyun 
143*4882a593Smuzhiyun 	if (scanr_len == 0) {
144*4882a593Smuzhiyun 		scanr_len_use = 0;
145*4882a593Smuzhiyun 		printf("[RK] NO WIFI SCAN_R OR READ END!!!\n");
146*4882a593Smuzhiyun 		return;
147*4882a593Smuzhiyun 	}
148*4882a593Smuzhiyun 
149*4882a593Smuzhiyun 	prctl(PR_SET_NAME,"rk_ble_send_data");
150*4882a593Smuzhiyun 
151*4882a593Smuzhiyun 	if(ble_mtu > BT_ATT_HEADER_LEN)
152*4882a593Smuzhiyun 		send_max_len = ble_mtu;
153*4882a593Smuzhiyun 
154*4882a593Smuzhiyun 	send_max_len -= BT_ATT_HEADER_LEN;
155*4882a593Smuzhiyun 	if(send_max_len > BT_ATT_MAX_VALUE_LEN)
156*4882a593Smuzhiyun 		send_max_len = BT_ATT_MAX_VALUE_LEN;
157*4882a593Smuzhiyun 
158*4882a593Smuzhiyun 	while (scanr_len) {
159*4882a593Smuzhiyun 		printf("[RK] %s: wifi use: %d, remain len: %d\n", __func__, scanr_len_use, scanr_len);
160*4882a593Smuzhiyun 		len = (scanr_len > send_max_len) ? send_max_len : scanr_len;
161*4882a593Smuzhiyun 		data = rk_wifi_list_buf + scanr_len_use;
162*4882a593Smuzhiyun 		usleep(100000);
163*4882a593Smuzhiyun 		rk_ble_write(BLE_UUID_WIFI_CHAR, data, len);
164*4882a593Smuzhiyun 		scanr_len -= len;
165*4882a593Smuzhiyun 		scanr_len_use += len;
166*4882a593Smuzhiyun 	}
167*4882a593Smuzhiyun }
168*4882a593Smuzhiyun 
_rk_ble_recv_data_cb(const char * uuid,char * data,int len)169*4882a593Smuzhiyun void _rk_ble_recv_data_cb(const char *uuid, char *data, int len)
170*4882a593Smuzhiyun {
171*4882a593Smuzhiyun 	if (!strcmp(uuid, BLE_UUID_WIFI_CHAR)) {
172*4882a593Smuzhiyun 		uint8_t str[512];
173*4882a593Smuzhiyun 		RockChipBleData *ble_data;
174*4882a593Smuzhiyun 		char *wifilist;
175*4882a593Smuzhiyun 		unsigned char end_flag = 0;
176*4882a593Smuzhiyun 
177*4882a593Smuzhiyun 		memset(str, 0, 512);
178*4882a593Smuzhiyun 		memcpy(str, data, len);
179*4882a593Smuzhiyun 		str[len] = '\0';
180*4882a593Smuzhiyun 		end_flag = str[len - 1];
181*4882a593Smuzhiyun 
182*4882a593Smuzhiyun 		printf("[RK] chr_write_value: %p, %d, data: %s\n", data, len, data);
183*4882a593Smuzhiyun 
184*4882a593Smuzhiyun 		for (int i = 0; i < len; i++) {
185*4882a593Smuzhiyun 			if (!( i % 8))
186*4882a593Smuzhiyun 				printf("\n");
187*4882a593Smuzhiyun 			printf("0x%02x ", str[i]);
188*4882a593Smuzhiyun 		}
189*4882a593Smuzhiyun 		printf("\n");
190*4882a593Smuzhiyun 
191*4882a593Smuzhiyun 		ble_data = (RockChipBleData *)str;
192*4882a593Smuzhiyun 
193*4882a593Smuzhiyun 		/* Msg is valid? */
194*4882a593Smuzhiyun 		printf("[RK] ble_data.cmd: %s, ble_data.start: %d, ble_data.end: %d\n",
195*4882a593Smuzhiyun 			ble_data->cmd, ble_data->start, end_flag);
196*4882a593Smuzhiyun 		if ((ble_data->start != 0x1) || (end_flag != 0x4)) {
197*4882a593Smuzhiyun 			printf("[RK] BLE RECV DATA ERROR !!!\n");
198*4882a593Smuzhiyun 			return;
199*4882a593Smuzhiyun 		}
200*4882a593Smuzhiyun 
201*4882a593Smuzhiyun 		if (strncmp(ble_data->cmd, "wifilists", 9) == 0) {
202*4882a593Smuzhiyun scan_retry:
203*4882a593Smuzhiyun 			printf("[RK] RK_wifi_scan ...\n");
204*4882a593Smuzhiyun 			RK_wifi_scan();
205*4882a593Smuzhiyun 			usleep(800000);
206*4882a593Smuzhiyun 
207*4882a593Smuzhiyun 			printf("[RK] RK_wifi_scan_r_sec ...\n");
208*4882a593Smuzhiyun 			wifilist = RK_wifi_scan_r_sec(0x14);
209*4882a593Smuzhiyun 			printf("[RK] RK_wifi_scan_r_sec end wifilist: %p\n", wifilist);
210*4882a593Smuzhiyun 
211*4882a593Smuzhiyun 			if (wifilist == NULL)
212*4882a593Smuzhiyun 				goto scan_retry;
213*4882a593Smuzhiyun 			if (wifilist && (strlen(wifilist) < 3)) {
214*4882a593Smuzhiyun 				free(wifilist);
215*4882a593Smuzhiyun 				goto scan_retry;
216*4882a593Smuzhiyun 			}
217*4882a593Smuzhiyun 
218*4882a593Smuzhiyun 			memset(rk_wifi_list_buf, 0, sizeof(rk_wifi_list_buf));
219*4882a593Smuzhiyun 			snprintf(rk_wifi_list_buf, sizeof(rk_wifi_list_buf), MSG_BLE_WIFI_LIST_FORMAT, wifilist);
220*4882a593Smuzhiyun 			scanr_len = strlen(rk_wifi_list_buf);
221*4882a593Smuzhiyun 			scanr_len_use = 0;
222*4882a593Smuzhiyun 			printf("[RK] wifi scan_r: %s, len: %d\n", rk_wifi_list_buf, scanr_len);
223*4882a593Smuzhiyun 
224*4882a593Smuzhiyun 			free(wifilist);
225*4882a593Smuzhiyun 			pthread_create(&wificonfig_scan_tid, NULL, rk_ble_send_data, NULL);
226*4882a593Smuzhiyun 		} else if (strncmp(ble_data->cmd, "wifisetup", 9) == 0) {
227*4882a593Smuzhiyun 			strcpy(wifi_ssid, ble_data->ssid); // str + 20);
228*4882a593Smuzhiyun 			strcpy(wifi_password, ble_data->psk); // str + 52);
229*4882a593Smuzhiyun 
230*4882a593Smuzhiyun 			printf("[RK] wifi ssid is %s\n", wifi_ssid);
231*4882a593Smuzhiyun 			printf("[RK] wifi psk is %s\n", wifi_password);
232*4882a593Smuzhiyun 
233*4882a593Smuzhiyun 			strcpy(wifi_cfg.ssid, wifi_ssid);
234*4882a593Smuzhiyun 			strcpy(wifi_cfg.psk, wifi_password);
235*4882a593Smuzhiyun 			//wifi_cfg.wifi_status_callback = wifi_status_callback;
236*4882a593Smuzhiyun 			pthread_create(&wificonfig_tid, NULL, rk_config_wifi_thread, NULL);
237*4882a593Smuzhiyun 		}
238*4882a593Smuzhiyun 	}
239*4882a593Smuzhiyun }
240*4882a593Smuzhiyun 
_rk_ble_request_data_cb(const char * uuid,char * data,int len)241*4882a593Smuzhiyun void _rk_ble_request_data_cb(const char *uuid, char *data, int len)
242*4882a593Smuzhiyun {
243*4882a593Smuzhiyun 	printf("=== %s uuid: %s===\n", __func__, uuid);
244*4882a593Smuzhiyun 
245*4882a593Smuzhiyun 	//len <= mtu(g_mtu)
246*4882a593Smuzhiyun 	len = sizeof("hello rockchip");
247*4882a593Smuzhiyun 	memcpy(data, "hello rockchip", len);
248*4882a593Smuzhiyun 
249*4882a593Smuzhiyun 	return;
250*4882a593Smuzhiyun }
251*4882a593Smuzhiyun 
252*4882a593Smuzhiyun static unsigned char bt_is_on = 0;
rk_bt_state_cb(RK_BT_STATE state)253*4882a593Smuzhiyun static void rk_bt_state_cb(RK_BT_STATE state)
254*4882a593Smuzhiyun {
255*4882a593Smuzhiyun 	switch(state) {
256*4882a593Smuzhiyun 	case RK_BT_STATE_TURNING_ON:
257*4882a593Smuzhiyun 		printf("RK_BT_STATE_TURNING_ON\n");
258*4882a593Smuzhiyun 		break;
259*4882a593Smuzhiyun 	case RK_BT_STATE_ON:
260*4882a593Smuzhiyun 		bt_is_on = 1;
261*4882a593Smuzhiyun 		printf("RK_BT_STATE_ON\n");
262*4882a593Smuzhiyun 		break;
263*4882a593Smuzhiyun 	case RK_BT_STATE_TURNING_OFF:
264*4882a593Smuzhiyun 		printf("RK_BT_STATE_TURNING_OFF\n");
265*4882a593Smuzhiyun 		break;
266*4882a593Smuzhiyun 	case RK_BT_STATE_OFF:
267*4882a593Smuzhiyun 		bt_is_on = 0;
268*4882a593Smuzhiyun 		printf("RK_BT_STATE_OFF\n");
269*4882a593Smuzhiyun 		break;
270*4882a593Smuzhiyun 	}
271*4882a593Smuzhiyun }
272*4882a593Smuzhiyun 
rk_ble_wifi_init(void * data)273*4882a593Smuzhiyun void rk_ble_wifi_init(void *data)
274*4882a593Smuzhiyun {
275*4882a593Smuzhiyun 	RkBtContent bt_content;
276*4882a593Smuzhiyun 
277*4882a593Smuzhiyun 	printf("===== %s =====\n", __func__);
278*4882a593Smuzhiyun 
279*4882a593Smuzhiyun 	//MUST TO SET 0
280*4882a593Smuzhiyun 	memset(&bt_content, 0, sizeof(RkBtContent));
281*4882a593Smuzhiyun 	bt_content.bt_name = strdup("RockChip");
282*4882a593Smuzhiyun 	bt_content.ble_content.ble_name = strdup("RockChipBle");
283*4882a593Smuzhiyun 	bt_content.ble_content.server_uuid.uuid = BLE_UUID_SERVICE;
284*4882a593Smuzhiyun 	bt_content.ble_content.server_uuid.len = UUID_128;
285*4882a593Smuzhiyun 	bt_content.ble_content.chr_uuid[0].uuid = BLE_UUID_WIFI_CHAR;
286*4882a593Smuzhiyun 	bt_content.ble_content.chr_uuid[0].len = UUID_128;
287*4882a593Smuzhiyun 	bt_content.ble_content.chr_cnt = 1;
288*4882a593Smuzhiyun 	bt_content.ble_content.cb_ble_recv_fun = _rk_ble_recv_data_cb;
289*4882a593Smuzhiyun 	bt_content.ble_content.cb_ble_request_data = _rk_ble_request_data_cb;
290*4882a593Smuzhiyun 	bt_content.ble_content.advDataType = BLE_ADVDATA_TYPE_SYSTEM;
291*4882a593Smuzhiyun 	bt_is_on = 0;
292*4882a593Smuzhiyun 
293*4882a593Smuzhiyun 	rk_ble_register_status_callback(_rk_ble_status_cb);
294*4882a593Smuzhiyun 	rk_bt_register_state_callback(rk_bt_state_cb);
295*4882a593Smuzhiyun 	rk_bt_init(&bt_content);
296*4882a593Smuzhiyun 
297*4882a593Smuzhiyun 	while (!bt_is_on)
298*4882a593Smuzhiyun 		sleep(1);
299*4882a593Smuzhiyun 
300*4882a593Smuzhiyun 	printf(">>>>> Start ble ....\n");
301*4882a593Smuzhiyun 	rk_ble_register_mtu_callback(_rk_ble_mtu_callback);
302*4882a593Smuzhiyun 	rk_ble_start(&bt_content.ble_content);
303*4882a593Smuzhiyun }
304*4882a593Smuzhiyun 
rk_ble_wifi_deinit(void * data)305*4882a593Smuzhiyun void rk_ble_wifi_deinit(void *data)
306*4882a593Smuzhiyun {
307*4882a593Smuzhiyun 	ble_mtu = 0;
308*4882a593Smuzhiyun 	rk_ble_stop();
309*4882a593Smuzhiyun 	sleep(3);
310*4882a593Smuzhiyun 	rk_bt_deinit();
311*4882a593Smuzhiyun }
312