20190605_jeffrey - silenceuncrio/diary GitHub Wiki

0855

回到 M300 - feature/lighttpd

利用原本的 iweb review 後

目前剩下這些要實做到 jweb

#if !defined(PROSRC_NO_DIDO) && defined(PROSRC_DO_REMOTE)
    mg_register_http_endpoint(nc, "/DO_ON",             _api_do_on);
    mg_register_http_endpoint(nc, "/DO_OFF",            _api_do_off);
    mg_register_http_endpoint(nc, "/DO_PULSE",          _api_do_pulse);
    mg_register_http_endpoint(nc, "/RESTORE_DO_ALARM",  _api_restore_do_alarm);
#endif

這個每一條需要 lighttpd rewrite rule 轉換到 /cgi-bin/api.cgi

不過只需要一條 rule 即可 - "^/(DO_ON|DO_OFF|DO_PULSE|RESTORE_DO_ALARM)$" => "/cgi-bin/api.cgi?act=$1",

修改後的 lighttpd 的 url.rewrite 如下

#### url handling modules (rewrite, redirect, access)
url.rewrite = (
  "^/api/([a-zA-Z]+)[0-9a-zA-Z=.?]*$" => "/cgi-bin/api.cgi?act=$1",
  "^/(DO_ON|DO_OFF|DO_PULSE|RESTORE_DO_ALARM)$" => "/cgi-bin/api.cgi?act=$1",
)

before and after the url rewrite

before after
/DO_ON /cgi-bin/api.cgi?act=DO_ON
/DO_OFF cgi-bin/api.cgi?act=DO_OFF
/DO_PULSE cgi-bin/api.cgi?act=DO_PULSE
/RESTORE_DO_ALARM cgi-bin/api.cgi?act=RESTORE_DO_ALARM

0930

幫忙準備兩台 M360-PW sample

搭配的 firmware 如下

  • uboot - M360-P-06052019.bootloader.img
  • image - M360-PW_v1.02_01F500001022E88D.img

利用 uboot 燒錄 uboot 後再燒錄 sysupgrade.bin

燒錄後開機發現 console 顯示的 host name 不對

M360-P login: root
Password:
Login incorrect
M360-P login:

generic 預設的帳密也不對

利用長按 reset button 來恢復出廠預設再看看

M360-PW login: root
Password:
M360-PW#

還要注意到 mgmt info list

M360-PW# mgmt info list
 model-name       = M360-PW
 lan-mac          = 00:0C:43:28:80:22
 wan-mac          = FA:6A:31:A1:9B:78
 sn               =
 smcsv            = 01F500001022E88D
 hmcsv            = 01F400661012E840
 bootloader       = 1.0
 software-version = 3.10.14
 firmware-version = 1.02
 hardware-version =
 modem            = EC25JFAR06A04M4G_DCM
 IMEI             = 865036040154708
 uptime           = 00:01:25
 production       = No
M360-PW#

注意到

  • lan-mac 還沒被指定
  • sn 沒有
  • smcsvhmcsv 不 match
    • 後續不能做 firmware upgrade
  • hardware-version 沒有
  • production 值為 No
    • 不會切換 partition

根據 sample 背後的 lable 來寫入所需的資訊

先補 lan-mac

這需要寫入 uboot env - macaddr

bash-4.4# fw_setenv macaddr 00:03:79:05:F0:2C

sn - fw_setenv serialno BL9U33TL002C

hmcsv - 寫的跟 smcsv 一樣即可 - fw_setenv hw_mcsv 01F500001022E88D

hardware-version - fw_setenv hw_ver 1.0

IMEI 跟 LTE module 綁一起 - 已告知 PM 跟 sample 的 lable 不同

production 值由 CLI command - production set the production is done

來設定該 device 已經完成生產

M360-PW/mgmt# production
Set the production is done
M360-PW/mgmt#

檢查一下

M360-PW# mgmt info list
 model-name       = M360-PW
 lan-mac          = 00:03:79:05:F0:2C
 wan-mac          = BE:3A:F5:9F:D6:51
 sn               = BL9U33TL002C
 smcsv            = 01F500001022E88D
 hmcsv            = 01F500001022E88D
 bootloader       = 1.0
 software-version = 3.10.14
 firmware-version = 1.02
 hardware-version = 1.0
 modem            = EC25JFAR06A04M4G_DCM
 IMEI             = 865036040154708
 uptime           = 00:01:13
 production       = Yes
M360-PW#

下一台

M360-PW# mgmt info list
 model-name       = M360-PW
 lan-mac          = 00:0C:43:28:80:A2
 wan-mac          = 8E:08:18:86:58:0A
 sn               =
 smcsv            = 01F500001022E88D
 hmcsv            = 01F400661002E776
 bootloader       = 1.0
 software-version = 3.10.14
 firmware-version = 1.02
 hardware-version =
 modem            = EC25JFAR06A04M4G_DCM
 IMEI             =
 uptime           = 00:00:49
 production       = Yes

lan-mac - fw_setenv macaddr 00:03:79:05:F0:54 sn - fw_setenv serialno BL9U33TL0054 hmcsv - fw_setenv hw_mcsv 01F500001022E88D hardware-version - fw_setenv hw_ver 1.0 production - production set the production is done

檢查

M360-PW# mgmt info list
 model-name       = M360-PW
 lan-mac          = 00:03:79:05:F0:54
 wan-mac          = EE:A8:4E:3D:4C:90
 sn               = BL9U33TL0054
 smcsv            = 01F500001022E88D
 hmcsv            = 01F500001022E88D
 bootloader       = 1.0
 software-version = 3.10.14
 firmware-version = 1.02
 hardware-version = 1.0
 modem            = EC25JFAR06A04M4G_DCM
 IMEI             = 865036040118331
 uptime           = 00:00:55
 production       = Yes
M360-PW#

收工

1045

繼續 M300 - feature/lighttpd

已居剛剛整理的 before and after the url rewrite

before after
/DO_ON /cgi-bin/api.cgi?act=DO_ON
/DO_OFF cgi-bin/api.cgi?act=DO_OFF
/DO_PULSE cgi-bin/api.cgi?act=DO_PULSE
/RESTORE_DO_ALARM cgi-bin/api.cgi?act=RESTORE_DO_ALARM

我需要實作出以下 CGI

  • /cgi-bin/api.cgi?act=DO_ON
  • /cgi-bin/api.cgi?act=DO_OFF
  • /cgi-bin/api.cgi?act=DO_PULSE
  • /cgi-bin/api.cgi?act=RESTORE_DO_ALARM

先做 /cgi-bin/api.cgi?act=DO_ON

原本 iweb 的 實作如下

static void _api_do_on(struct mg_connection *nc, int ev, void *ev_data)
{
    switch (ev)
    {
        case MG_EV_HTTP_REQUEST:
            {
                struct http_message *hm = (struct http_message *) ev_data;
                //printf("_handler_level_admin: %.*s\n", (int) hm->uri.len, hm->uri.p);
                struct session *s = get_session(hm);
                /* Ask the user to log in if they did not present a valid cookie. */
                if (s == NULL)
                {
                    //printf("_handler_level_admin: send 401 error\n");
                    //mg_http_send_error(nc, 401, NULL);
                    mg_http_send_redirect(nc, 302, mg_mk_str("/#/login"), mg_mk_str(NULL));
                    nc->flags |= MG_F_SEND_AND_CLOSE;
                    break;
                }

                int level = _get_user_level_by_name(s->user);
                if (level < ATTVAL_SYSTEM_LEVEL2)
                {
                    //printf("_handler_level_normal: send 403 error\n");
                    mg_http_send_error(nc, 403, NULL);
                    break;
                }

                //pio_alarm();
                ICOS_msg_sendto(MODULE_WEBUI, MODULE_ALARM, NULL, 0, ICOS_UCAST_REMOTE_DO_ON);

                mg_printf(nc,
                          "HTTP/1.1 200 OK\r\n"
                          "Content-type: application/json\r\n"
                          "\r\n"
                          "{ \"result\": success }\r\n");

                nc->flags |= MG_F_SEND_AND_CLOSE;

                break;
            }
    }
}

就是呼叫 ICOS_msg_sendto(MODULE_WEBUI, MODULE_ALARM, NULL, 0, ICOS_UCAST_REMOTE_DO_ON); 前注意一下 user level 即可

1555

commit 16ceb2fa079c1164542d48e2642d07cf31785cdd
Refs: [feature/lighttpd]
Author: jeffrey <[email protected]>
Date:   Wed Jun 5 15:54:24 2019 +0800

    offer the following CGI
    - /cgi-bin/api.cgi?act=DO_ON
    - /cgi-bin/api.cgi?act=DO_OFF
    - /cgi-bin/api.cgi?act=DO_PULSE
    - /cgi-bin/api.cgi?act=RESTORE_DO_ALARM

    api.cgi
    - jweb.access.filter(ATTVAL_SYSTEM_LEVEL2, _api_do_on);
    - jweb.access.filter(ATTVAL_SYSTEM_LEVEL2, _api_do_off);
    - jweb.access.filter(ATTVAL_SYSTEM_LEVEL2, _api_do_pulse);
    - jweb.access.filter(ATTVAL_SYSTEM_LEVEL2, _api_restore_do_alarm);

 proscend/prosrc/webcgi/api.c | 45 ++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 45 insertions(+)