这里先说说alljoyn在4004上运行的环境,alljoyn所有组件要能运行,包括操作系统,协议栈等,需要至少200多k的flash,100多kram,对CPU资源是个严重挑战,太多的ram也许你编译都不能通过,有可能你编译通过了,硬件堆栈不够用,系统也会异常。这个需要你有耐心去优化下,嵌入式系统本来就如此。其他的CPU可能会好很多,毕竟不需要这么复杂的底层系统来支持。
这里先教会大家先用起来,再去理解他。如果要想了解整个系统的运作,估计要写一本书才能够充分说明这个事情,当然这是后面的安排。这里先看看软件的处理流程:
图一:主程序
int AJ_Main(void)
{
AJ_Status status = AJ_OK;
uint8_t isUnmarshalingSuccessful = FALSE;
AJSVC_ServiceStatus serviceStatus;
AJ_Message msg;
int ipaddr;
gpio_set_pin_dir(GPIO_KEY1,1); //set input
gpio_set_pin_dir(GPIO_KEY2,1); //set input
gpio_set_pin_dir(GPIO_k1_LED,0); //set output
gpio_set_pin_dir(GPIO_K2_LED,0); //set output
gpio_set_pin_dir(GPIO_K1,0); //set output
gpio_set_pin_dir(GPIO_k2,0); //set output
//gpio_set_pin_dir(WIFI_LED,0); //set output
gpio_set_pin_low(GPIO_k1_LED);
k_msleep(1000);
k1_onoff(0);
k2_onoff(0);
set_key_interrupt();
AJ_Initialize();
AJ_AboutSetIcon(aboutIconContent, aboutIconContentSize, aboutIconMimetype, aboutIconUrl);
//About_Init(NULL,aboutIconMimetype,aboutIconContent, aboutIconContentSize, aboutIconUrl);
status = PropertyStore_Init();
if (status != AJ_OK) {
goto Exit;
}
AJ_Debug("---------ssidNameVar=%s,ssidPasswdNameVar=%s------------\n",ssidNameVar,ssidPasswdNameVar);
status = AJServices_Init(AJ_ABOUT_SERVICE_PORT, AppObjects, ProxyObjects, deviceManufactureName, deviceProductName);
if (status != AJ_OK) {
AJ_ErrPrintf(("AJServices_Init() error %s\n", (AJ_StatusText(status))));
goto Exit;
}
//AJ_RegisterObjects(AppObjects, ProxyObjects);
AJ_RegisterObjects(AppObjects, NULL);
SetBusAuthPwdCallback(MyBusAuthPwdCB);
while (TRUE) {
status = AJ_OK;
serviceStatus = AJSVC_SERVICE_STATUS_NOT_HANDLED;
if(gpio_get_pin_state(GPIO_KEY1)==0){
printf("..................GPIO_KEY1 IS LOW 1............... \n");
//goto LABLE_OTA;
//k1_onoff(3);
}
if(gpio_get_pin_state(GPIO_KEY2)==0){
printf("..................GPIO_KEY2 IS LOW............... \n");
if(key_timer++>5)
goto LABLE_OTA;
}
else
key_timer=0;
if (!isBusConnected) {
printf("..................AJRouter_Connect............... \n");
isBusConnected = AJRouter_Connect(&busAttachment, ROUTER_NAME);
if (!isBusConnected) { // Failed to connect to router?
continue; // Retry establishing connection to router.
}
}
//printf("..................AJApp_ConnectedHandler............... \n");
status = AJApp_ConnectedHandler(&busAttachment);
//printf("..................AJOBS_IsWiFiConnected............... \n");
#ifdef ONBOARDING_SERVICE
if (!AJOBS_IsWiFiConnected()) {
status = AJ_ERR_RESTART;
}
#endif
if (status == AJ_OK) {
status = AJ_UnmarshalMsg(&busAttachment, &msg, AJAPP_UNMARSHAL_TIMEOUT);
isUnmarshalingSuccessful = (status == AJ_OK);
if (status == AJ_ERR_TIMEOUT) {
if (AJ_ERR_LINK_TIMEOUT == AJ_BusLinkStateProc(&busAttachment)) {
status = AJ_ERR_READ; // something's not right. force disconnect
} else { // nothing on bus, do our own thing
//printf("..................AJApp_DoWork............... \n");
AJApp_DoWork(&busAttachment);
continue;
}
}
if (isUnmarshalingSuccessful) {
//printf("..................isUnmarshalingSuccessful............... \n");
if (serviceStatus == AJSVC_SERVICE_STATUS_NOT_HANDLED) {
serviceStatus = AJApp_MessageProcessor(&busAttachment, &msg, &status);
}
if (serviceStatus == AJSVC_SERVICE_STATUS_NOT_HANDLED) {
//Pass to the built-in bus message handlers
status = AJ_BusHandleBusMessage(&msg);
}
AJ_NotifyLinkActive();
}
//Unmarshaled messages must be closed to free resources
AJ_CloseMsg(&msg);
}
if (status == AJ_ERR_READ || status == AJ_ERR_RESTART || status == AJ_ERR_RESTART_APP) {
if (isBusConnected) {
AJApp_DisconnectHandler(&busAttachment, status != AJ_ERR_READ);
isBusConnected = !AJRouter_Disconnect(&busAttachment, status != AJ_ERR_READ);
if (status == AJ_ERR_RESTART_APP) {
LABLE_OTA:
ipaddr=SERVER_IP;
qca_OTA_tftp(ipaddr, "app", 1, 1);
AJ_Reboot();
}
}
}
} // while (TRUE)
return 0;
Exit:
return (1);
}
图二:调试输出
*********** start alljoyn task ***********
### MEM FREE : 25324.
000.000 aj_target_nvram.c:119 AJ_NVRAM_Init() :_AJ_EraseNVRAM
000.174 aj_nvram.c:186 AJ_NVRAM_Open(): Data set 4098. does not exist
000.181 aj_nvram.c:209 AJ_NVRAM_Open(): failure: status=AJ_OK
000.189 PropertyStore.c:376 nvram read fieldIndex=2 [DeviceName] langIndex=0 [en] entry=2 val= size=33 status=AJ_OK
000.201 aj_nvram.c:186 AJ_NVRAM_Open(): Data set 4099. does not exist
000.208 aj_nvram.c:209 AJ_NVRAM_Open(): failure: status=AJ_OK
000.214 PropertyStore.c:376 nvram read fieldIndex=3 [DefaultLanguage] langIndex=0 [en] entry=3 val= size=8 status=AJ_OK
000.226 aj_nvram.c:186 AJ_NVRAM_Open(): Data set 4100. does not exist
000.234 aj_nvram.c:209 AJ_NVRAM_Open(): failure: status=AJ_OK
000.240 PropertyStore.c:376 nvram read fieldIndex=4 [Passcode] langIndex=0 [en] entry=4 val= size=33 status=AJ_OK
000.252 aj_nvram.c:186 AJ_NVRAM_Open(): Data set 4101. does not exist
000.259 aj_nvram.c:209 AJ_NVRAM_Open(): failure: status=AJ_OK
000.265 PropertyStore.c:376 nvram read fieldIndex=5 [RealmName] langIndex=0 [en] entry=5 val= size=11 status=AJ_OK
000.277 aj_nvram.c:186 AJ_NVRAM_Open(): Data set 4102. does not exist
000.284 aj_nvram.c:209 AJ_NVRAM_Open(): failure: status=AJ_OK
000.290 PropertyStore.c:376 nvram read fieldIndex=6 [Ssid] langIndex=0 [en] entry=6 val= size=11 status=AJ_OK
000.302 aj_nvram.c:186 AJ_NVRAM_Open(): Data set 4103. does not exist
000.309 aj_nvram.c:209 AJ_NVRAM_Open(): failure: status=AJ_OK
000.315 PropertyStore.c:376 nvram read fieldIndex=7 [SsidPasswd] langIndex=0 [en] entry=7 val= size=11 status=AJ_OK
000.327 PropertyStore.c:198 Set key [DeviceId] defaultValue [f198954d9baf879ec755d669a5bcea3d]
000.337 PropertyStore.c:198 Set key [DeviceName] defaultValue [My Smple AC 5bcea3d]
---------ssidNameVar=,ssidPasswdNameVar=------------
..................AJCFG_Start...............
Init(): Set Consumer to detect SuperAgent option is turned ON
----------------------WidgetsInit end!---------------------
..................AJRouter_Connect...............
Attempting to connect to bus 'org.alljoyn.BusNode'
Connected to OPENWRT_TOM, bssid = a8-40-41-13-4a-20, channel = 3, rssi = 14
图三:APP客户界面
控制界面:
多个APK,显示界面。如果你有多个终端,可以同步显示设备的状态。
本例程所有所有代码都会开源,我们下载专区上线后,大家都可以去下载,测试。这里先上个二进制,先玩玩。
后面将系统介绍alljoyn协议的前世今生。