搜索
bottom↓
回复: 57

建议合方圆公司人员编写GU900用代码,方便大家使用!

[复制链接]

出0入0汤圆

发表于 2013-5-25 11:01:55 | 显示全部楼层 |阅读模式
本帖最后由 gzhmcu 于 2013-5-25 11:03 编辑

GU900真滴好给力,希望贵公司人员编写短信控制,支持中文滴,GPRSDTU等等方便移植的代码,以STC单片机为例程,大家一起呼吁一下吧!不是广告呀,只是建议
支持开源,方便大家,你们也多卖产品!

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2013-5-27 00:06:54 | 显示全部楼层
好久没上论坛看帖子,看到客户对我们的直接评价,很欣慰。
基于单片机的开源代码,我们这方面确实是弱项,原因:1、我们没有玩STC单片机;2、我们的开源方面已经有OPEN AT的DEMO代码,里面带一个AT指令处理框架,我们相信这个框架一些编程思想可以应用到其它平台。AT指令的基本格式是请求-应答,除了极少数是unsolicited,比如,AT+CREG=2 后,模块主动上报基站信息;有来电时,会上报“RING”提示等。AT指令的标准格式是行处理,指令返回都是通过"\r\n“来分行(编码时,"\r"也足够了),有时候串口并非一次返回,可能返回的结果是分段返回。

一般购买我们的GU900D模块,我们提供合适的原理图、封装库等方便客户开发,缩短客户开发周期是我们的希望所在。


#include "gu_sdk.h"
#include "custom_app.h"
#include "at_handler.h"

static gu_char                 g_cmd_buf[512];
static gu_uint16          g_cmd_idx = 0;

static at_command_type_enum g_at_cmd_type;
static const char                         *g_response_prefix = NULL;
static at_response_struct         *g_sp_response = NULL;

static const char * s_unsolicited_msg[] = {   
        "+IPD:",    // TCP IP data coming
        "+CMT:",    // SMS message coming
        "+CMTI:",   // SMS message coming
        "+CREG:",   /* sometimes! */
        "RING",     // Somebody call me
};

static const char * s_finalResponsesError[] = {   
        "ERROR",   
        "+CMS ERROR:",   
        "+CME ERROR:",   
        "NO CARRIER", /* sometimes! */   
};

static const char * s_finalResponsesSuccess[] = {   
        "OK",   
        "CONNECT OK"       /* some stacks start up data on another channel */
};


/** returns 1 if line starts with prefix, 0 if it does not */
int strStartsWith(const char *line, const char *prefix)
{   
        for ( ; (*line != '\0' && *line != '\r') && *prefix != '\0' ; line++, prefix++)
        {        
                if (*line != *prefix)
                {            
                        return 0;        
                }   
        }
        return (*prefix == '\0');
}

int at_is_final_response_error(const char *line)
{   
        gu_uint8 i;   

        for (i = 0 ; i < NUM_ELEMS(s_finalResponsesError) ; i++)
        {        
                if (strStartsWith(line, s_finalResponsesError[i]))
                {            
                        return 1;        
                }   
        }   
        return 0;
}/** * returns 1 if line is a final response indicating success * See 27.007 annex B * WARNING: NO CARRIER and others are sometimes unsolicited */


int at_is_final_response_success(const char *line)
{
        gu_uint8 i;   
        for (i = 0 ; i < NUM_ELEMS(s_finalResponsesSuccess) ; i++)
        {        
                if (strStartsWith(line, s_finalResponsesSuccess[i]))
                {            
                        return 1;        
                }   
        }   
        return 0;
}

at_unsolicited_msg_enum at_check_unsolicited_msg(const char *line)
{
        gu_uint8 i;   

        for (i = 0 ; i < NUM_ELEMS(s_unsolicited_msg) ; i++)
        {        
                if (strStartsWith(line, s_unsolicited_msg[i]))
                {            
                        return i;
                }   
        }
        return UNSOL_END;
}

static gu_char  *at_strdup(const gu_char *str)
{
        gu_uint16 len = strlen(str);
        gu_char   *strtmp = gu_app_malloc(len + 1);

        strcpy(strtmp, str);
        return strtmp;
}

/** add an intermediate response to g_sp_response*/
static void add_intermediate(at_response_struct *p_response, const gu_char *line)
{
    at_line_struct *p_new;

    p_new = (at_line_struct*)gu_app_malloc(sizeof(at_line_struct));

    p_new->line = at_strdup(line);

    /* note: this adds to the head of the list, so the list
       will be in reverse order of lines received. the order is flipped
       again before passing on to the command issuer */
    p_new->p_next = p_response->p_intermediates;
    p_response->p_intermediates = p_new;
}

at_response_struct *at_response_new()
{
        at_response_struct *resp = (at_response_struct *)gu_app_malloc(sizeof(at_response_struct));

        if (resp == NULL)
        {
                return NULL;
        }
        memset(resp, 0, sizeof(at_response_struct));
    return resp;
}

void at_response_free(at_response_struct *p_response)
{
    at_line_struct *p_line;

    if (p_response == NULL) return;

    p_line = p_response->p_intermediates;

    while (p_line != NULL)
    {
        at_line_struct *p_toFree;

        p_toFree = p_line;
        p_line = p_line->p_next;

        gu_app_free(p_toFree->line);
        gu_app_free(p_toFree);
    }
        if (p_response->final_response)
            gu_app_free(p_response->final_response);
    gu_app_free(p_response);
}

static void at_handle_unsolicited(const char *line)
{
        at_unsolicited_msg_enum unsol_msg;

        unsol_msg = at_check_unsolicited_msg(line);
       
        switch (unsol_msg)
        {
                case UNSOL_IPD:
                        break;
                case UNSOL_CMT:
                {
                        sms_cmt_msg_handler(unsol_msg, line, GU_TRUE);
                        break;
                }
                case UNSOL_CMTI:
                        break;
                case UNSOL_CREG:
                        break;
                case UNSOL_RING:
                        break;
                default:
                {
                        sms_cmt_msg_handler(unsol_msg, line, GU_TRUE);
                        UNIT_TEST_DBG(GU_AT_PROC, "Unsupported response type %d\n", unsol_msg);
                        break;
                }
        }
        g_cmd_idx = 0;
}

/*****************************************************************************
* FUNCTION
*         at_process_line()
* DESCRIPTION
*         When AT result is comming, it should be processed by this function. It shall parse the AT result one line by one line.
*     All AT command can be seperated by '\r\n'.
*     
* PARAMETERS
*         line[in],  one line content in the AT result.
*
* RETURN
*         NONE
* ...:
*****************************************************************************/
static void at_process_line(const gu_char *line)
{
        UNIT_TEST_DBG(GU_AT_PROC, "at_process_line=%s", line);
       
    if (g_sp_response == NULL) {
        /* no command pending */
        at_handle_unsolicited(line);
    }
    // Check final response
    else if (at_is_final_response_success(line) && (!g_response_prefix ||
            g_sp_response->p_intermediates ))
    {
        g_sp_response->success = AT_RET_SUCCESS;
    }
    else if (at_is_final_response_error(line))
    {
        g_sp_response->success = AT_RET_ERROR;
    }
    else if (g_response_prefix && strcmp(line, "> ") == 0 && strcmp(line, g_response_prefix) == 0)
    {
        g_sp_response->success = AT_RET_SUCCESS;
    }
    else
    {
            switch (g_at_cmd_type)
            {
                case NO_RESULT:
                    at_handle_unsolicited(line);
                    break;
                case NUMERIC:
                    if (g_sp_response->p_intermediates == NULL
                        && ((line[0] >= '0') && (line[0] <= '9')))
                    {
                        add_intermediate(g_sp_response, line);
                    }
                    else
                    {
                        /* either we already have an intermediate response or
                                               the line doesn't begin with a digit */
                        at_handle_unsolicited(line);
                    }
                    break;
                case SINGLELINE:
                    if (g_sp_response->p_intermediates == NULL && strStartsWith (line, g_response_prefix))
                    {
                            g_sp_response->success = AT_RET_SUCCESS;
                        add_intermediate(g_sp_response, line);
                    }
                    else if (!at_is_final_response_success(line))
                    {
                        /* we already have an intermediate response */
                        at_handle_unsolicited(line);
                    }
                    break;
                case MULTILINE:
                    if (strStartsWith (line, g_response_prefix))
                    {
                        add_intermediate(g_sp_response, line);
                    }
                    else
                    {
                        at_handle_unsolicited(line);
                    }
                        break;
                case WAIT_EXPECT:
                        if (strStartsWith (line, g_response_prefix))
                        {
                                g_sp_response->success = AT_RET_SUCCESS;
                        }
                        break;
                default: /* this should never be reached */
                    UNIT_TEST_DBG(GU_AT_PROC, "Unsupported AT command type %d\n", g_at_cmd_type);
                    at_handle_unsolicited(line);
                break;
            }
        }            
}


/*****************************************************************************
* FUNCTION
*         at_event_handler()
* DESCRIPTION
*         When AT result is comming, it should be processed by this function. It shall parse the AT result one line by one line.
*     All AT command can be seperated by '\r\n'.
*     
* PARAMETERS
*         msg_req[in],  the message of AT result from core.
*
* RETURN
*         NONE
* ...:
*****************************************************************************/
void at_event_handler(gu_message_req_struct *msg_req)
{
        gu_char         result_str[512 + 1];
        gu_uint16         result_idx = 0;
        gu_uint16         n = 0, i = 0, len ;
        gu_bool                is_line;

        memset(result_str, 0, sizeof(result_str));

        // Store the unfinished data for last time
        for (n = 0; n < g_cmd_idx; )
        {
                result_str[n] = g_cmd_buf[n];
                n++;
        }
        is_line = GU_FALSE;
       
        while (i < msg_req->data_length)
        {
                while (msg_req->data[i] == '\r' || msg_req->data[i] == '\n')
                {
                        i++;
                        if (n > 0)
                                is_line = GU_TRUE;
                }
                for (; i < msg_req->data_length && n < sizeof(result_str); i++)
                {
                        if (msg_req->data[i] == '\r' &&
                                msg_req->data[i+1] == '\n')        // for sms,tcp,http,ftp prompt
                        {
                                if (n > 0)
                                        is_line = GU_TRUE;
                                break;
                        }
                        g_cmd_buf[g_cmd_idx++] = msg_req->data[i];
                        result_str[n++] = msg_req->data[i];
                }
               
                len = strlen(result_str);
                if (!is_line && result_str[0] == '>') // For SMS, TCP, HTTP, FTP etc
                {
                        is_line = GU_TRUE;
                }

                if (len == 0 || !is_line)
                {
                        break;
                }
               
                //UNIT_TEST_DBG(GU_AT_PROC, "i=%d, n=%d, dlen=%d, idx=%d:\"%s\"", i, n,
                //        msg_req->data_length, g_cmd_idx, result_str);

                g_cmd_idx = 0;
                at_process_line(result_str);

                memset(result_str, 0, sizeof(result_str));
                n = 0;
        }

        while (msg_req->data[i] == '\r' || msg_req->data[i] == '\n')
                i++;
        //// write the rest data to g_cmd_buf for next line
        if (is_line)
        {
                for (g_cmd_idx = 0; i < msg_req->data_length && g_cmd_idx < sizeof(g_cmd_buf); i++)
                {
                        g_cmd_buf[g_cmd_idx++] = msg_req->data[i];
                }
        }
        //UNIT_TEST_DBG(GU_AT_PROC, "at_event_handler(len=%d) l=%d, n=%d, idx=%d", msg_req->data_length,
        //        is_line, n, g_cmd_idx);

}

/*****************************************************************************
* FUNCTION
*         at_exe_cmd_wait_result()
* DESCRIPTION
*         User can use this function to send AT command to the SDK core, then wait for the result , this function just provides
*     a good method to avoid ugly program in the source code. The user also can send AT command to the SDK core with
*     the gu_send_at_command function, but you need to get the result from the main message in GU_MSG_AT_RESULT .
*     after releasing the current thread.
*     
* PARAMETERS
*         at_cmd_data[in],  AT command or data sent to core.
*     data_len[in],                 the length of AT command or data
*     cmd_type[in],         refer to at_command_type_enum in gu_sdk_def.h
*         response_prefix[in],the prefix of the AT command result, for example, "AT+CREG?" returns "+CREG: 0,x", the prefix is "+CREG"
*     timeout_ms[in],        command executation timeout
*     p_response_out[in,out], result shall be stored in this param, caller should allocate a new at_response_struct and release it by himself
*
* RETURN
*         NONE
* ...:
*****************************************************************************/
at_ret_code_enum at_exe_cmd_wait_result(gu_char    *at_cmd_data,
                                                                gu_uint16            data_len,
                                                                at_command_type_enum cmd_type,
                                                                        const gu_char        *response_prefix,
                                                                        gu_uint32            timeout_ms,
                                                                        at_response_struct   *p_response_out)
{
        gu_message_req_struct *msg_req = NULL;
        at_ret_code_enum          ret = AT_RET_SUCCESS;

        if (gu_send_at_command(at_cmd_data, data_len) == GU_FALSE)
        {
                UNIT_TEST_DBG(GU_AT_PROC, "AT data queue is full %d", data_len);
                return GU_FALSE;
        }
        if (p_response_out)
        {
                g_sp_response = p_response_out;
        }
        else
        {
                g_sp_response = at_response_new();
        }
        g_at_cmd_type = cmd_type;
        g_response_prefix = response_prefix;
        g_sp_response->success = AT_RET_INIT;

        gu_app_start_timer(timeout_ms);
        if (data_len < 50)
                UNIT_TEST_DBG(GU_AT_PROC, "at_exe_cmd_wait_result(\"%s\",%d)", at_cmd_data, timeout_ms);
        else
                UNIT_TEST_DBG(GU_AT_PROC, "at_exe_cmd_wait_result(%d)", timeout_ms);
        while (g_sp_response->success == AT_RET_INIT)
        {
                if ((msg_req = gu_get_message()))
                {
                        if (msg_req->msg_type == GU_MSG_AT_RESULT)
                        {
                                at_event_handler(msg_req);
                        }
                        else if (msg_req->msg_type == GU_MSG_TIMER_EXPIRE)        // main timer is expire
                        {
                                g_sp_response->success = AT_RET_TIMEOUT;
                                UNIT_TEST_DBG(GU_AT_PROC, "main timer is expire", timeout_ms);
                        }
                        else        // process other message from CORE
                        {
                                cm_message_handler(msg_req);
                        }
                        gu_free_message(msg_req);
                }
        }
        gu_app_stop_timer();

        ret = g_sp_response->success;
        // Release response memory if app user don't care it
        if (p_response_out == NULL)
        {
                at_response_free(g_sp_response);
        }
        g_sp_response = NULL;
        g_response_prefix = NULL;
       
        return ret;
}



/*****************************************************************************
* FUNCTION
*         sms_cmd_handler()
* DESCRIPTION
*         Whatever the sms_text is come from SMS or uart, we can handler it as a command and do what we would like to.
*     
* PARAMETERS
*     sms_text[in],   the receiving SMS message
*        send_sms[in],          do we need to send SMS message.
* RETURN
*         GU_TRUE or GU_FALSE;
* ...:
*****************************************************************************/
gu_bool sms_cmd_handler(const gu_char *sms_text, gu_bool send_sms)
{
        gu_char  phone_num[32];
        gu_bool         success = GU_FALSE;

        if (!strncmp(sms_text, "zjyh:", 5))
        {
                if (!sms_get_phone_num(sms_text, "zjyh:", phone_num))
                {
                        sms_adm_send_response("zjyh:the phone number is incorrect", GU_FALSE, send_sms);
                        return GU_TRUE;
                }
                success = sms_update_admin_role(phone_num, ROLE_USER, ACTION_ADD);
                sms_adm_send_response((success ? "zjyh:OK" : "zjyh:the user is existed"), GU_FALSE, send_sms);
                return GU_TRUE;
        }
        else if (!strncmp(sms_text, "scyh:", 5))
        {
                if (!sms_get_phone_num(sms_text, "scyh:", phone_num))
                {
                        sms_adm_send_response("scyh:phone number is incorrect", GU_FALSE, send_sms);
                        return GU_TRUE;
                }
                if (sms_get_user_role(phone_num) == ROLE_ADMIN)
                {
                        sms_adm_send_response("scyh:you can't delete admin", GU_FALSE, send_sms);
                        return GU_TRUE;
                }
                success = sms_update_admin_role(phone_num, ROLE_USER, ACTION_DEL);
                sms_adm_send_response((success ? "scyh:OK" : "scyh:there is no user to be deleted"), GU_FALSE, send_sms);
                return GU_TRUE;
        }
        else if (!strncmp(sms_text, "cxyh", 4))
        {
                gu_char         buffer[256];
                gu_int8                i;

                buffer[0] = '\0';
                for (i = 0; i < MAX_ADMIN_NUM; i++)
                {
                        if (g_admin_role[i].role == ROLE_NONE)
                        {
                                break;
                        }
                        sprintf(buffer + strlen(buffer), "cxyh:%s:%d\r\n", g_admin_role[i].admin_phone, g_admin_role[i].role);
                }
                if (strlen(buffer) > 0)
                        sms_adm_send_response(buffer, GU_TRUE, send_sms);
                else
                        sms_adm_send_response("cxyh:no user", GU_FALSE, send_sms);
                return GU_TRUE;
        }
        else if (!strncmp(sms_text, "szgly:", 6))
        {
                if (!sms_get_phone_num(sms_text, "szgly:", phone_num))
                {
                        sms_adm_send_response("szgly:you didn't input phone number", GU_FALSE, send_sms);
                        return GU_TRUE;
                }
                // Need to delete the user who exists in phone book
                if (sms_get_user_role(phone_num) == ROLE_USER)
                {
                        if (!sms_update_admin_role(phone_num, ROLE_USER, ACTION_DEL))
                        {
                                sms_adm_send_response("szgly:failed to delete the user", GU_FALSE, send_sms);
                                return GU_TRUE;
                        }
                }
                success = sms_update_admin_role(phone_num, ROLE_ADMIN, ACTION_ADM_UPT);
                sms_adm_send_response((success ? "szgly:admin had been changed." : "szgly:error"), GU_FALSE, send_sms);
                return GU_TRUE;
        }
        else if (!strncmp(sms_text, "setbaud:", 8))
        {
                gu_char         buffer[64];
               
                if (!sms_get_phone_num(sms_text, "setbaud:", phone_num))
                {
                        sms_adm_send_response("setbaud:baudrate set error", GU_FALSE, send_sms);
                        return GU_TRUE;
                }
                sprintf(buffer, "AT+CIPR=%s\r\n", phone_num);
                success = (at_exe_cmd_wait_result(buffer, strlen(buffer), SINGLELINE, NULL, 3000, NULL) == AT_RET_SUCCESS);
                sms_adm_send_response((success ? "setbaud:OK" : "setbaud:ERROR"), GU_FALSE, send_sms);
                return GU_TRUE;
        }

        return GU_FALSE;
}

gu_bool sms_get_phone_num(const gu_char *sms_text,
        const gu_char *prefix, gu_char *phone_num)
{       
        gu_bool                        ret = GU_FALSE;
        const gu_char        *tmp = NULL;

        if ((tmp = (gu_char*)strstr(sms_text, prefix)))
        {
                const gu_char        *tmp2 = NULL;
               
                tmp = tmp + strlen(prefix);

                if ((tmp2 = (gu_char*)strstr(tmp, "+86")))        // Chinese area code
                {
                        tmp = tmp2 + 3;
                }
                while (*tmp != ',' && *tmp != '\0' && *tmp != '\r' && *tmp != '\n')
                {
                        if ((*tmp >= '0') && (*tmp <= '9'))
                        {
                                *phone_num = *tmp;
                                phone_num++;

                                ret = GU_TRUE;
                        }
                        tmp++;
                }
               
        }
        *phone_num = '\0';
        UNIT_TEST_DBG(GU_SMS_UART, "sms_get_phone_num(%s,%s)=%s", sms_text, prefix, phone_num);
        return ret;
}

gu_bool sms_get_quote_str(const gu_char *sms_text,
        const gu_char *prefix, const gu_char start, const gu_char end, gu_char *text_out)
{       
        gu_bool                        ret = GU_FALSE;
        gu_char                        *tmp = NULL;

        if ((tmp = (gu_char*)strstr(sms_text, prefix)))
        {
                tmp = tmp + strlen(prefix);
               
                while (*tmp != start)
                        tmp++;
                tmp++;
                while (*tmp != end)
                {
                        *text_out = *tmp;
                        text_out++;
                        tmp++;
                }
                ret = GU_TRUE;
        }
        *text_out = '\0';
        UNIT_TEST_DBG(GU_SMS_UART, "sms_get_quote_str=(%s)", text_out);
        return ret;
}

/*****************************************************************************
* FUNCTION
*         sms_cmt_msg_handler()
* DESCRIPTION
*         Check the comming SMS message to see if the message needs to be handlered.
*     
* PARAMETERS
*         unsol_msg[in],  SMS message type.
*     sms_text[in],   the receiving SMS message
* RETURN
*         NONE
* ...:
*****************************************************************************/
void sms_cmt_msg_handler(at_unsolicited_msg_enum unsol_msg, const gu_char *sms_text,
                gu_bool send_sms)
{
        UNIT_TEST_DBG(GU_SMS_UART, "sms_cmt_msg_handler(%d,%s,%d)role=%d, %d", unsol_msg, sms_text, send_sms,
                g_sms_user_role, g_unsol_msg);
        if (unsol_msg == UNSOL_CMT)
        {
                g_sms_user_role = ROLE_NONE;
                // 1. get mobile number
                if (sms_get_phone_num(sms_text, "+CMT: ", gu_phone_num))
                {
                        // 2. Check if the mobile number is administrator or normal user
                        if (g_first_bootup == GU_TRUE)
                        {
                                g_sms_user_role = ROLE_ADMIN;
                                //sms_update_admin_role(phone_num, g_sms_user_role, ACTION_ADM_UPT);
                        }
                        else
                        {
                                g_sms_user_role = sms_get_user_role(gu_phone_num);
                        }
                }
                gu_buzzer_sound(3200);
        }
        else if(g_unsol_msg == UNSOL_CMT && unsol_msg == UNSOL_END)
        {
                g_gui_menu = MENU_SMS;
                g_sms_curr_page = 0;
                g_sms_pages = strlen(sms_text) / MAX_LCD_BYTES + 1;

                memset(g_sms_buff, 0, sizeof(g_sms_buff));
                gu_lcd_put_string(gu_phone_num, GU_TRUE);
                gu_app_sleep_ms(3000);
                gu_lcd_put_string(sms_text, GU_TRUE);
                strcpy(g_sms_buff, sms_text);
               
        }
        g_unsol_msg = unsol_msg;
}

/*****************************************************************************
* FUNCTION
*         sms_send_message()
* DESCRIPTION
*         send the text to the phone_num, it uses AT command to send it out.
*     
* PARAMETERS
*         phone_num[in],  phone number likes as '1398478944'.
*     sms_text[in],   the sending SMS message
*     sms_len[in],     SMS text len
* RETURN
*         GU_TRUE, OK; GU_FALSE, fails
* ...:
*****************************************************************************/
gu_bool        sms_send_message(gu_char *phone_num, gu_char *sms_text, gu_uint16 sms_len, gu_bool english)
{
        gu_uint8        counter = 1;
        gu_char buffer[256];
        gu_char *codec[] = {
                "GB2312",        // Chinese language
                "GSM",
        };
       
        UNIT_TEST_DBG(GU_SMS_UART, "sms_send_message(%s,,%d,%d)", phone_num, sms_len, english);
        sprintf(buffer, "AT+CSCS=\"%s\"\r\n", codec[english]);
        if (at_exe_cmd_wait_result(buffer, strlen(buffer), SINGLELINE, NULL, 3000, NULL) != AT_RET_SUCCESS)
        {
                return GU_FALSE;
        }

        while (counter-- > 0)
        {
                sprintf(buffer, "AT+CMGS=\"%s\"\r\n", phone_num);
                if (at_exe_cmd_wait_result(buffer, strlen(buffer), SINGLELINE, "> ", 3000, NULL) != AT_RET_SUCCESS)
                {
                        app_power_down();
                }
                gu_app_sleep_ms(50);
                if (!gu_send_at_command(sms_text, sms_len))
                {
                        app_power_down();
                }
                *buffer = 0x1A;
                if (at_exe_cmd_wait_result(buffer, 1, SINGLELINE, NULL, 120000, NULL) == AT_RET_SUCCESS)
                {
                        break;
                }
                gu_app_sleep_ms(3000);
                UNIT_TEST_DBG(GU_SMS_UART, "Try send SMS again counter=%d", counter);
        }
        return GU_TRUE;
       
}

/*****************************************************************************
* FUNCTION
*         sms_adm_send_response()
* DESCRIPTION
*         Only send SMS message to admin.
*     
* PARAMETERS
*     sms_text[in],   the sending SMS message
*     english[in],      Is english
*         send_sms[in],   send SMS or print to uart
* RETURN
*         GU_TRUE, OK; GU_FALSE, fails
* ...:
*****************************************************************************/
gu_bool        sms_adm_send_response(gu_char *sms_text, gu_bool english, gu_bool send_sms)
{
        if (send_sms)
        {
                return sms_send_message(g_admin_role[0].admin_phone, sms_text, strlen(sms_text), english);
        }
        else
        {
                Uart_Printf("%s\r\n",sms_text);
                return GU_TRUE;
        }
}

/*****************************************************************************
* FUNCTION
*         sms_nor_send_response()
* DESCRIPTION
*         Send SMS message to all uses.
*     
* PARAMETERS
*     sms_text[in],   the sending SMS message
*     english[in],      Is english
*         send_sms[in],   send SMS or print to uart
*
* RETURN
*         GU_TRUE, OK; GU_FALSE, fails
* ...:
*****************************************************************************/
gu_bool        sms_nor_send_response(gu_char *sms_text, gu_uint16 sms_len, gu_bool english)
{
        gu_int8                i;

        UNIT_TEST_DBG(GU_SMS_UART, "sms_nor_send_response(,%d,%d)", sms_len, english);

        for (i = 0; i < MAX_ADMIN_NUM; i++)
        {
                if (g_admin_role[i].role == ROLE_NONE)
                {
                        break;
                }
                sms_send_message(g_admin_role[i].admin_phone, sms_text, sms_len, english);
        }
       
        return GU_TRUE;
}



出0入0汤圆

发表于 2013-6-7 16:01:51 | 显示全部楼层
本帖最后由 sxmilovebb2 于 2013-6-7 16:03 编辑
gzhmcu 发表于 2013-6-7 13:25
晚上发给你吧,请留邮箱,淘宝上,木有,不过我们可以去某宝交易地!只是为了保险,选择某宝交易,与广告 ...


没人规定不能发淘宝连接的啊。你发出来吧,可能还有其他网友需要的呢。淘宝上搜到的都是模块,还要再自己打板测试。

话说淘宝卖这个的跟Q2403A/Q2406A的差远了,也贵了。不知实际零散买的话能便宜到多少啊。。。

出0入0汤圆

 楼主| 发表于 2013-6-8 07:47:46 | 显示全部楼层
sxmilovebb2 发表于 2013-6-7 16:01
没人规定不能发淘宝连接的啊。你发出来吧,可能还有其他网友需要的呢。淘宝上搜到的都是模块,还要再自己 ...

也行,这样吧,我领开个帖子,免费送大家一款GPS+SIM900A+STC的空板,条件是必须要我这款GU900的开发板!不知道怎么样?怕违法论坛的规矩

出0入0汤圆

发表于 2013-5-25 11:58:16 | 显示全部楼层
顶一个

出0入0汤圆

发表于 2013-5-25 12:23:24 | 显示全部楼层
哥们,阅GPRS模块无数呀,现在又玩上GU900 了吗。
这个模块效果如何,

出0入0汤圆

 楼主| 发表于 2013-5-25 12:39:52 | 显示全部楼层
kation122 发表于 2013-5-25 12:23
哥们,阅GPRS模块无数呀,现在又玩上GU900 了吗。
这个模块效果如何,

过奖了,GU900确实不错,不是替他们说好话,而且吧,他们技术支持挺给力地,向他们要他们自己的DTU图纸,都给了,国产不一定就差,反而国产的东东更适合国内的情况!

出0入0汤圆

 楼主| 发表于 2013-5-25 12:41:06 | 显示全部楼层
longsky1985 发表于 2013-5-25 11:58
顶一个

谢谢支持

出0入0汤圆

发表于 2013-5-25 12:46:55 | 显示全部楼层
确实很给力,使用sim900调试好长时间没有搞定,使用GU900很快就搞定了,而且很稳定
技术支持也很不错

出0入0汤圆

发表于 2013-5-25 12:48:16 | 显示全部楼层
gzhmcu 发表于 2013-5-25 12:41
谢谢支持

你不是用过SIM900A吗? 现在已经上产品并量产了吗? 效果如何?

想听听你对这几个GPRS模块的评价,我也是玩自动化的,最近想搞一个自动化的RTU模块内嵌在仪器里面.

出0入0汤圆

 楼主| 发表于 2013-5-25 13:00:08 | 显示全部楼层
kinsno 发表于 2013-5-25 12:48
你不是用过SIM900A吗? 现在已经上产品并量产了吗? 效果如何?

想听听你对这几个GPRS模块的评价,我也是玩 ...

sim900a已经量产,也不错,只是版本不一样的电气特殊不同,导致我把板子上的电感都拆掉了才好,GU900的上线速度等等都比较快,尤其是他的一些DTU呀,中文短信呀,耗电量什么的全面超越SIM900

出0入0汤圆

发表于 2013-5-25 13:39:08 | 显示全部楼层
GU900用MTK做的,二次开发环境也是MTK的那些库

出0入42汤圆

发表于 2013-5-25 14:22:08 | 显示全部楼层
这个模块有什么优势嘛?

出0入0汤圆

 楼主| 发表于 2013-5-25 16:08:50 | 显示全部楼层
wingerchen 发表于 2013-5-25 13:39
GU900用MTK做的,二次开发环境也是MTK的那些库

不管是什么,我们都认为外部MCU更好,因为例如我们需要16位AD,需要给模块掉电以节约电源!

出0入0汤圆

 楼主| 发表于 2013-5-25 16:09:17 | 显示全部楼层
canback 发表于 2013-5-25 14:22
这个模块有什么优势嘛?

优势很多,你去他们公司看看

出0入224汤圆

发表于 2013-5-25 16:19:36 | 显示全部楼层
stc就算了吧.

出0入0汤圆

 楼主| 发表于 2013-5-25 17:57:07 | 显示全部楼层
yyts 发表于 2013-5-25 16:19
stc就算了吧.

我自己的产品用的是NXP arm7的,说实话,都是用状态机,没什么必要用高版本的,STC15系列的有SOP28封装,比较容易手工焊接,这个阿莫大哥说要手工

出0入0汤圆

发表于 2013-5-25 19:27:45 来自手机 | 显示全部楼层
有没有西门子的模块好?

出0入0汤圆

 楼主| 发表于 2013-5-26 16:24:53 | 显示全部楼层
ljt80158015 发表于 2013-5-25 19:27
有没有西门子的模块好?

这个不好对比,但是比他们上线更快,功能更实用

出0入0汤圆

发表于 2013-5-26 19:17:18 | 显示全部楼层
gzhmcu 发表于 2013-5-26 16:24
这个不好对比,但是比他们上线更快,功能更实用

好比啊,不比别的,就比故障率。

出0入0汤圆

发表于 2013-5-26 22:12:11 | 显示全部楼层
确实不错,我们转GU900之后,陆续上线13K,前后使用时间10个月,还算很稳定。只是生产开初遇到一个小问题,四个接地焊盘的钢网上锡问题,后经厂家解决之后,生产使用都很稳定。

出0入0汤圆

发表于 2013-5-26 22:24:32 来自手机 | 显示全部楼层
Mark…
来自:amoBBS 阿莫电子论坛 Windows Phone 7 客户端

出0入0汤圆

发表于 2013-5-27 00:08:36 | 显示全部楼层
最近也确实想弄几个GPRS模块测试一下,初步预定的是,SIM900A,M72D,再加上这个GU900,可能还要看看西门子的一个,不过华为的就算了。

请教楼主,我去合方圆的技术支持那,能拿到该模块的原理图和PCB封装不?

出0入0汤圆

发表于 2013-5-27 01:28:17 | 显示全部楼层
能改IMEI吗?

出0入0汤圆

发表于 2013-5-27 08:56:12 | 显示全部楼层
sxmilovebb2 发表于 2013-5-27 01:28
能改IMEI吗?

有专门指令可以改的。

出0入0汤圆

 楼主| 发表于 2013-5-27 12:54:27 | 显示全部楼层
kinsno 发表于 2013-5-27 00:08
最近也确实想弄几个GPRS模块测试一下,初步预定的是,SIM900A,M72D,再加上这个GU900,可能还要看看西门子 ...

他们技术支持很给力的,放心用吧,封装他们都给,模块的应用图纸也能给!

出0入0汤圆

 楼主| 发表于 2013-5-27 12:57:08 | 显示全部楼层
sxmilovebb2 发表于 2013-5-27 01:28
能改IMEI吗?

如果你想通过串号写绑定程序,没有必要,他们的模块可以读到内部MCU的ID,MCU 的ID是不能改写的

出0入0汤圆

 楼主| 发表于 2013-5-27 12:58:13 | 显示全部楼层
lqs10 发表于 2013-5-27 00:06
好久没上论坛看帖子,看到客户对我们的直接评价,很欣慰。
基于单片机的开源代码,我们这方面确实是弱项, ...

想用贵公司的模块搞个开源项目! ,希望多支持!

出0入0汤圆

发表于 2013-5-28 13:45:56 | 显示全部楼层
gzhmcu 发表于 2013-5-27 12:58
想用贵公司的模块搞个开源项目! ,希望多支持!

好啊,大力支持。

出0入0汤圆

 楼主| 发表于 2013-5-29 11:20:04 | 显示全部楼层
lqs10 发表于 2013-5-28 13:45
好啊,大力支持。

工程准备中,准备另开帖了,开帖后通知您

出0入0汤圆

发表于 2013-5-30 10:09:43 | 显示全部楼层
gzhmcu 发表于 2013-5-27 12:57
如果你想通过串号写绑定程序,没有必要,他们的模块可以读到内部MCU的ID,MCU 的ID是不能改写的 ...

SIM自消费,要修改模块IMEI的哦,

出0入0汤圆

发表于 2013-6-3 15:48:07 | 显示全部楼层
sxmilovebb2 发表于 2013-5-30 10:09
SIM自消费,要修改模块IMEI的哦,

IMEI的修改,GU900D有指令可以实现的。

出0入0汤圆

发表于 2013-6-4 07:30:25 | 显示全部楼层
lqs10 发表于 2013-6-3 15:48
IMEI的修改,GU900D有指令可以实现的。

有无开发板之类的在售?淘宝没找到

出0入0汤圆

发表于 2013-6-5 11:42:26 | 显示全部楼层
sxmilovebb2 发表于 2013-6-4 07:30
有无开发板之类的在售?淘宝没找到

在淘宝上搜索 DTU200或 GU900D 就能找到几个卖家,自己选择交易的卖家,呵呵。这里不能发淘宝链接,否则坛主会生气的。

出0入0汤圆

发表于 2013-6-5 11:44:00 | 显示全部楼层
谢谢 很有用!~~

出0入0汤圆

 楼主| 发表于 2013-6-6 10:13:45 | 显示全部楼层
sxmilovebb2 发表于 2013-6-4 07:30
有无开发板之类的在售?淘宝没找到

我有工程板,改开发板给你呀

出0入0汤圆

发表于 2013-6-6 10:36:57 | 显示全部楼层
关注一下,:)

出0入0汤圆

 楼主| 发表于 2013-6-6 13:09:55 | 显示全部楼层
stdio 发表于 2013-6-6 10:36
关注一下,:)

谢谢关注

出0入0汤圆

发表于 2013-6-6 15:00:28 | 显示全部楼层
gzhmcu 发表于 2013-6-6 10:13
我有工程板,改开发板给你呀

有无淘宝链接

出0入0汤圆

 楼主| 发表于 2013-6-7 13:25:02 | 显示全部楼层
sxmilovebb2 发表于 2013-6-6 15:00
有无淘宝链接

晚上发给你吧,请留邮箱,淘宝上,木有,不过我们可以去某宝交易地!只是为了保险,选择某宝交易,与广告无关,不能违反了论坛的规矩

出0入0汤圆

发表于 2013-6-7 15:17:23 | 显示全部楼层
gzhmcu 发表于 2013-6-7 13:25
晚上发给你吧,请留邮箱,淘宝上,木有,不过我们可以去某宝交易地!只是为了保险,选择某宝交易,与广告 ...

关注~~~~~

出0入0汤圆

发表于 2013-6-10 21:40:42 | 显示全部楼层
gzhmcu 发表于 2013-6-8 07:47
也行,这样吧,我领开个帖子,免费送大家一款GPS+SIM900A+STC的空板,条件是必须要我这款GU900的开 ...

好,很好,非常好(凑字数)

出0入0汤圆

 楼主| 发表于 2013-6-10 21:48:51 | 显示全部楼层
sxmilovebb2 发表于 2013-6-10 21:40
好,很好,非常好(凑字数)

过完节的吧,在论坛上搞个活动,看看大家有多少人想要,如果多,我可以单独制作一款给大家使用

出0入0汤圆

发表于 2013-6-17 11:08:02 | 显示全部楼层
gzhmcu 发表于 2013-6-10 21:48
过完节的吧,在论坛上搞个活动,看看大家有多少人想要,如果多,我可以单独制作一款给大家使用 ...

能否q聊

出0入0汤圆

 楼主| 发表于 2013-6-17 16:54:02 | 显示全部楼层
sxmilovebb2 发表于 2013-6-17 11:08
能否q聊

木有问题

出0入0汤圆

发表于 2013-6-17 20:30:49 | 显示全部楼层
gzhmcu 发表于 2013-6-17 16:54
木有问题


你给我的qq我搜不到
我给你的qq你又不加

出0入0汤圆

 楼主| 发表于 2013-6-18 09:06:20 | 显示全部楼层
sxmilovebb2 发表于 2013-6-17 20:30
你给我的qq我搜不到
我给你的qq你又不加

我加你

出0入0汤圆

发表于 2013-6-18 11:05:05 | 显示全部楼层
链接呢?咋没看到?

出0入0汤圆

 楼主| 发表于 2013-6-19 09:39:07 | 显示全部楼层
kinsno 发表于 2013-6-18 11:05
链接呢?咋没看到?

不着急呀,等等,太忙了,在北京学习呢!

出0入0汤圆

发表于 2013-6-19 20:20:41 | 显示全部楼层
gzhmcu 发表于 2013-6-19 09:39
不着急呀,等等,太忙了,在北京学习呢!

在北京?北京哪一块!我站内私信你了。

出0入0汤圆

发表于 2013-8-9 08:16:54 | 显示全部楼层
不错

出0入0汤圆

发表于 2013-10-12 10:55:57 | 显示全部楼层
还有没有GU900D的开发板啊

出0入0汤圆

 楼主| 发表于 2013-10-13 10:09:00 | 显示全部楼层
miaoguoqiang 发表于 2013-10-12 10:55
还有没有GU900D的开发板啊

有,不过得焊接原价

出0入0汤圆

发表于 2013-10-13 16:07:00 | 显示全部楼层
gzhmcu 发表于 2013-10-13 10:09
有,不过得焊接原价

元件还是原价?

出0入0汤圆

发表于 2015-9-12 10:32:46 | 显示全部楼层
赞一个。

出0入0汤圆

发表于 2015-10-18 22:49:43 | 显示全部楼层
楼主,那是说合方圆的GU900S可以进行二次开发是吗?

出0入0汤圆

发表于 2015-10-18 23:10:27 | 显示全部楼层
No pictures?

出0入0汤圆

 楼主| 发表于 2016-4-12 10:56:02 | 显示全部楼层
shaobaov5 发表于 2016-3-31 11:00
说的很好,不过现在用GU900E比较多,

恩,确实是这样
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-29 17:11

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表