成人免费无码不卡毛片,亚洲AⅤ无码精品一区二区三区,国产尤物精品视频,久久精品日本亚洲,欧美成人一区三区无码乱码A片,中文字日产幕码一区二区色哟哟,亞洲日韓中文字幕網AV

  • 方案介紹
    • 前言
    • ?一、演示效果
    • 二、模塊
    • 三、代碼編寫
    • ?四、參考
  • 附件下載
  • 推薦器件
  • 相關(guān)推薦
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

C學(xué)習(xí)-信息轉(zhuǎn)換為PUD格式發(fā)送短信(限英文)

2024/03/20
2605
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

聯(lián)系方式.docx

共1個(gè)文件

前言

因?yàn)橹白鲰?xiàng)目的時(shí)候,每次使用短信模塊發(fā)送短信都需要在平臺(tái)去轉(zhuǎn)換一次數(shù)據(jù),搞的相當(dāng)麻煩,所以就嘗試這可以寫一共PUD格式轉(zhuǎn)換的文件來在程序中讓他自動(dòng)就轉(zhuǎn)換成功,

**? 轉(zhuǎn)載請(qǐng)注明出處

?一、演示效果

1. 參數(shù)定義

2. STM32串口輸出

?3. 平臺(tái)驗(yàn)證

PDU轉(zhuǎn)換器icon-default.png?t=N7T8http://smstools3.kekekasvi.com/topic.php?id=288

二、模塊

開發(fā)版的話還是用到的STM32系列,首先使用到的模塊的話?也在我之前提到的一個(gè)聯(lián)網(wǎng)模塊,支撐GPRS和GSM功能,用來學(xué)習(xí)再適合不過了,我就直接丟篇博客了

嵌入式外設(shè)集 -- GSM+GPRS聯(lián)網(wǎng)模塊(GA6-B)icon-default.png?t=N7T8https://blog.csdn.net/herui_2/article/details/130560784?spm=1001.2014.3001.5502

三、代碼編寫

1. C 程序驗(yàn)證代碼

該程序可以將電話號(hào)碼和文本消息數(shù)據(jù)編碼為發(fā)送到手機(jī)的協(xié)議數(shù)據(jù)單元(PDU)格式。主功能體現(xiàn)在`to_pdu`函數(shù),它處理電話號(hào)碼反轉(zhuǎn)和Unicode數(shù)據(jù)轉(zhuǎn)換,然后將這些組合成PDU字符串。如果編碼成功,它將輸出PDU的長度和內(nèi)容;如果失敗,則輸出失敗信息

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

// 判斷輸入字符串是否全部為數(shù)字字符。
int is_numeric(const char *input) {
    while (*input) {
        // 如果當(dāng)前字符不是數(shù)字,則返回0(假)。
        if (!isdigit((unsigned char) *input)) return 0;
        input++;
    }
    // 如果所有字符都是數(shù)字,則返回1(真)。
    return 1;
}

// 將電話號(hào)碼中每兩位字符進(jìn)行反轉(zhuǎn)。
char *two_bit_inversion(const char *phone) {
    // 如果輸入字符串包含非數(shù)字字符,則返回NULL。
    if (!is_numeric(phone)) return NULL;
    size_t len = strlen(phone);
    // 為反轉(zhuǎn)后的電話號(hào)碼分配內(nèi)存。額外的空間是給'F'和'?'的。
    char *inverted_phone = malloc(len + 1 + (len % 2));

    if (inverted_phone == NULL) return NULL;

    // 如果電話號(hào)碼的長度為奇數(shù),則添加一個(gè)'F'。
    if(len % 2 == 1) {
        strcat(strcpy(inverted_phone, phone), "F"); // 如果長度為奇數(shù),則在末尾加上'F'
    } else {
        strcpy(inverted_phone, phone);
    }

    // 在字符串中交換相鄰字符的位置。
    for(size_t i = 0; i < len; i += 2) {
        char tmp = inverted_phone[i];
        inverted_phone[i] = inverted_phone[i + 1];
        inverted_phone[i + 1] = tmp;
    }

    return inverted_phone;
}

// 將輸入字符串轉(zhuǎn)換為Unicode字符串。
void string_to_unicode(const char *input, char *output) {
    while (*input) {
        // 將輸入字符串的每個(gè)字符轉(zhuǎn)換為Unicode,并存儲(chǔ)在輸出字符串中。
        sprintf(output, "%04X", (unsigned char)*input++);
        output += 4;
    }
}

// 從電話號(hào)碼和數(shù)據(jù)中構(gòu)建PDU(協(xié)議數(shù)據(jù)單元)字符串。
char *to_pdu(const char *phone, const char *data) {
    // 利用two_bit_inversion函數(shù)轉(zhuǎn)換電話號(hào)碼。
    char *pdu_phone = two_bit_inversion(phone);
    // 如果轉(zhuǎn)換失敗,則返回NULL。
    if (!pdu_phone) return NULL;

    size_t len = strlen(data);
    char unicode_data[len * 4 + 1];
    // 將數(shù)據(jù)轉(zhuǎn)換為Unicode編碼。
    string_to_unicode(data, unicode_data);

    // 計(jì)算PDU消息中數(shù)據(jù)的長度。
    int data_length = strlen(unicode_data) / 2;
    // 計(jì)算PDU消息的總長度。
    size_t pdu_length = strlen("0011000D9168") + strlen(pdu_phone) + strlen("0008FF") + 2 + strlen(unicode_data) + 1;
    char *message = malloc(pdu_length);

    // 如果消息分配失敗,則釋放電話號(hào)碼內(nèi)存并返回NULL。
    if (message == NULL) {
        free(pdu_phone);
        return NULL;
    }

    // 構(gòu)建PDU消息。
    sprintf(message, "0011000D9168%s0008FF%02X%s", pdu_phone, data_length, unicode_data);

    // 釋放電話號(hào)碼內(nèi)存。
    free(pdu_phone);
    // 返回PDU消息字符串。
    return message;
}

int main() {
    const char *phone = "15883813998";
    const char *data = "999999";

    // 調(diào)用to_pdu函數(shù)并打印結(jié)果。
    char *pdu = to_pdu(phone, data);
    if (pdu) {
        // 打印NUM,表示PDU的長度。
        printf("NUM %dn", strlen(pdu)/2-1);
        // 打印PDU。
        printf("PDU: %s", pdu);

        // 使用完后記得釋放內(nèi)存。
        free(pdu);
    } else {
        // 如果編碼PDU失敗,則打印失敗信息。
        printf("Failed to encode PDU.n");
    }

    return 0;
}

2. STM32移植

main.c

移植的時(shí)候需要注意,這個(gè)C代碼再keil環(huán)境里面是跑不成功的,需要在 VSCode 或者其他編譯器繼續(xù)編譯生成hex文件,代碼本身沒有問題,只是keil不能格式兼容。

pdu.c

#include "pdu.h"

// 判斷輸入字符串是否全部為數(shù)字字符。
int is_numeric(const char *input)
{
    while (*input)
    {
        // 如果當(dāng)前字符不是數(shù)字,則返回0(假)。
        if (!isdigit((unsigned char)*input))
            return 0;
        input++;
    }
    // 如果所有字符都是數(shù)字,則返回1(真)。
    return 1;
}

// 將電話號(hào)碼中每兩位字符進(jìn)行反轉(zhuǎn)。
char *two_bit_inversion(const char *phone)
{
    int len;
    char *inverted_phone;
    int i;
    char tmp;

    // 如果輸入字符串包含非數(shù)字字符,則返回NULL。
    if (!is_numeric(phone))
        return NULL;
    len = strlen(phone);
    // 為反轉(zhuǎn)后的電話號(hào)碼分配內(nèi)存。額外的空間是給'F'和'?'的。
    inverted_phone = malloc(len + 1 + (len % 2));

    if (inverted_phone == NULL)
        return NULL;

    // 如果電話號(hào)碼的長度為奇數(shù),則添加一個(gè)'F'。
    if (len % 2 == 1)
    {
        strcat(strcpy(inverted_phone, phone), "F"); // 如果長度為奇數(shù),則在末尾加上'F'
    }
    else
    {
        strcpy(inverted_phone, phone);
    }

    // 在字符串中交換相鄰字符的位置。
    for (i = 0; i < len; i += 2)
    {
        tmp = inverted_phone[i];
        inverted_phone[i] = inverted_phone[i + 1];
        inverted_phone[i + 1] = tmp;
    }

    return inverted_phone;
}

// 將輸入字符串轉(zhuǎn)換為Unicode字符串。
void string_to_unicode(const char *input, char *output)
{
    while (*input)
    {
        // 將輸入字符串的每個(gè)字符轉(zhuǎn)換為Unicode,并存儲(chǔ)在輸出字符串中。
        sprintf(output, "%04X", (unsigned char)*input++);
        output += 4;
    }
}

// 從電話號(hào)碼和數(shù)據(jù)中構(gòu)建PDU(協(xié)議數(shù)據(jù)單元)字符串。
char *to_pdu(const char *phone, const char *data)
{
    char *pdu_phone;
    int len;
    int data_length;
    int pdu_length;
    char *message;
    // 利用two_bit_inversion函數(shù)轉(zhuǎn)換電話號(hào)碼。
    pdu_phone = two_bit_inversion(phone);
    // 如果轉(zhuǎn)換失敗,則返回NULL。
    if (!pdu_phone)
        return NULL;

    len = strlen(data);
    char unicode_data[len * 4 + 1];

    // 將數(shù)據(jù)轉(zhuǎn)換為Unicode編碼。
    string_to_unicode(data, unicode_data);

    // 計(jì)算PDU消息中數(shù)據(jù)的長度。
    data_length = strlen(unicode_data) / 2;
    // 計(jì)算PDU消息的總長度。
    pdu_length = strlen("0011000D9168") + strlen(pdu_phone) + strlen("0008FF") + 2 + strlen(unicode_data) + 1;
    message = malloc(pdu_length);

    // 如果消息分配失敗,則釋放電話號(hào)碼內(nèi)存并返回NULL。
    if (message == NULL)
    {
        free(pdu_phone);
        return NULL;
    }

    // 構(gòu)建PDU消息。
    sprintf(message, "0011000D9168%s0008FF%02X%s", pdu_phone, data_length, unicode_data);

    // 釋放電話號(hào)碼內(nèi)存。
    free(pdu_phone);
    // 返回PDU消息字符串。
    return message;
}

pdu.h

#ifndef __PUD_H
#define __PUD_H
// C 庫
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

// 定義電話號(hào)碼和消息(必須是英文)
int is_numeric(const char *input);
char *two_bit_inversion(const char *phone);
void string_to_unicode(const char *input, char *output);
char *to_pdu(const char *phone, const char *data);

#endif

3. Android 驗(yàn)證代碼

就是通過朋友寫的這個(gè)java文件,才有靈感去做的這個(gè)格式轉(zhuǎn)換,這里也發(fā)給大家做個(gè)參考


object PduConvert {
    fun toPdt(phone: String, data: String): PduData? {
        val headers = "0011000D9168"
        val pduPhone = twoBitInversion(phone) ?: return null
        val unicodeData = stringToUnicode(data)
        val dataLength = (unicodeData.length / 2).toString(16).padStart(2, '0')
        val message =
            (headers + pduPhone + "0008FF" + dataLength + unicodeData).uppercase(Locale.getDefault())
        return PduData(data.length * 2 + 15, message)
    }

    private fun twoBitInversion(data: String): String? {
        var phone = data
        return if (isNumeric(phone)) {
            if (phone.length % 2 == 1) phone += "F"
            phone.chunked(2) // 每兩位一組進(jìn)行分割
                .joinToString("") { it.reversed() } // 每組內(nèi)的字符翻轉(zhuǎn)后拼接到一起
        } else
            null
    }

    private fun isNumeric(input: String): Boolean {
        val regex = Regex("""^d+$""")
        return regex.matches(input)
    }

    fun stringToUnicode(input: String): String {
        val stringBuilder = StringBuilder()
        for (char in input) {
            stringBuilder.append("u").append(char.toInt().toString(16).padStart(4, '0'))
        }
        return stringBuilder.toString().replace("u", "")
    }

    fun unicodeToString(input: String): String {
        val stringBuilder = StringBuilder()
        input.chunked(4).forEach {
            val charCode = Integer.parseInt(it, 16)
            stringBuilder.append(charCode.toChar())
        }
        return stringBuilder.toString()
    }
}

?四、參考

SMS短信的PDU編碼規(guī)則icon-default.png?t=N7T8https://blog.csdn.net/zx249388847/article/details/52597990/?ops_request_misc=&request_id=&biz_id=102&utm_term=%E4%BF%A1%E6%81%AF%E8%BD%AC%E6%8D%A2%E4%B8%BAPUD%E6%A0%BC%E5%BC%8F%E5%8F%91%E9%80%81%E7%9F%AD%E4%BF%A1&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~sobaiduweb~default-5-52597990.nonecase&spm=1018.2226.3001.4450


請(qǐng)關(guān)注公眾號(hào)進(jìn)行獲取和咨詢


**? 轉(zhuǎn)載請(qǐng)注明出處

聯(lián)系方式 微信號(hào):13648103287

  • 聯(lián)系方式.docx
    下載

推薦器件

更多器件
器件型號(hào) 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊(cè) ECAD模型 風(fēng)險(xiǎn)等級(jí) 參考價(jià)格 更多信息
FTLF8519P3BNL 1 Finisar Corporation Transceiver, 840nm Min, 860nm Max, 2125Mbps(Tx), 2125Mbps(Rx), LC Connector, Panel Mount, ROHS COMPLIANT PACKAGE

ECAD模型

下載ECAD模型
$39.4 查看
CPC1560G 1 IXYS Corporation Transistor Output SSR, 1-Channel, 3750V Isolation, DIP-8
$4.67 查看
COM1305-0.032768-EXT-T-TR 1 Raltron Electronics Corporation CMOS Output Clock Oscillator, 0.032768MHz Nom,
暫無數(shù)據(jù) 查看

相關(guān)推薦

方案定制

去合作
方案開發(fā)定制化,2000+方案商即時(shí)響應(yīng)!

方案定制,程序設(shè)計(jì)方案、單片機(jī)程序設(shè)計(jì)與講解、APP定制開發(fā)。本公眾號(hào)致力于向讀者傳遞關(guān)于程序設(shè)計(jì)和開發(fā)的相關(guān)知識(shí),并分享一些關(guān)于軟件開發(fā)的最佳實(shí)踐。如果您有什么問題或建議,請(qǐng)隨時(shí)聯(lián)系我們。我們將竭誠為您服務(wù)

门头沟区| 化州市| 方山县| 宜川县| 屏南县| 闵行区| 长阳| 和顺县| 阿瓦提县| 楚雄市| 沙洋县| 天柱县| 清远市| 屯昌县| 柘荣县| 西乡县| 开阳县| 常山县| 麟游县| 兴安盟| 鸡泽县| 循化| 水城县| 大足县| 涟源市| 桂东县| 格尔木市| 绥宁县| 济宁市| 九龙城区| 宁夏| 金山区| 镇沅| 十堰市| 罗源县| 旌德县| 台前县| 泗水县| 湖北省| 百色市| 漳浦县|