Skip to content

Commit 118c2a7

Browse files
authored
Feature/multi-sms (#31)
1 parent 11ea5cc commit 118c2a7

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+1722
-924
lines changed

README.md

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,13 @@ Feedback is very much welcome and please request features 🙂
1212
[HeboTech.GsmApi](https://github.com/hbjorgo/GsmApi) is a REST API wrapping this library.
1313

1414
## Supported commands:
15-
- Send SMS (text and PDU (GSM7bit, UCS2, ANSI))
15+
- Send SMS in text or PDU (GSM 7 bit or UCS2) format.
16+
- Send concatenated SMS (message that spans over multiple SMSs) in PDU (GSM 7 bit or UCS2) format
17+
- SMS supports emojies
1618
- List SMSs
17-
- Read SMS (text and PDU)
19+
- Read SMS (text or PDU (GSM 7 bit or UCS2)
1820
- Delete SMS
19-
- Set SMS message format (text and PDU (GSM7bit, UCS2, ANSI))
21+
- Set SMS message format (text or PDU (GSM 7 bit or UCS2))
2022
- Dial number
2123
- Answer incoming call
2224
- Hang up call
@@ -93,7 +95,7 @@ if (simStatus == SimStatus.SIM_PIN)
9395
var smsTextFormatResult = await modem.SetSmsMessageFormatAsync(SmsTextFormat.Text);
9496

9597
// Send SMS to the specified number
96-
var smsReference = await modem.SendSMSAsync(new PhoneNumber("0123456789"), "Hello ATLib!");
98+
var smsReference = await modem.SendSmsInTextFormatAsync(new PhoneNumber("123456789"), "Hello ATLib!");
9799
Console.WriteLine($"SMS Reference: {smsReference}");
98100
```
99101
Because it relies on a stream, you can even control a modem over a network! Either use a network attached modem, or forward a modem serial port to a network port.

src/HeboTech.ATLib.TestConsole/FunctionalityTest.cs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using HeboTech.ATLib.Modems.D_LINK;
66
using HeboTech.ATLib.Parsers;
77
using System;
8+
using System.Collections.Generic;
89
using System.Threading.Tasks;
910

1011
namespace HeboTech.ATLib.TestConsole
@@ -149,21 +150,24 @@ public static async Task RunAsync(System.IO.Stream stream, string pin)
149150
string smsMessage = Console.ReadLine();
150151

151152
Console.WriteLine("Sending SMS...");
152-
ModemResponse<SmsReference> smsReference = null;
153153
switch (smsTextFormat)
154154
{
155155
case SmsTextFormat.PDU:
156-
smsReference = await modem.SendSmsInPduFormatAsync(phoneNumber, smsMessage, smsCodingScheme);
156+
IEnumerable<ModemResponse<SmsReference>> smsReferences = await modem.SendSmsInPduFormatAsync(phoneNumber, smsMessage, smsCodingScheme);
157+
foreach (var smsReference in smsReferences)
158+
Console.WriteLine($"SMS Reference: {smsReference}");
157159
break;
158160
case SmsTextFormat.Text:
159-
smsReference = await modem.SendSmsInTextFormatAsync(phoneNumber, smsMessage);
161+
{
162+
ModemResponse<SmsReference> smsReference = await modem.SendSmsInTextFormatAsync(new PhoneNumber(phoneNumberString), smsMessage);
163+
if (smsReference is not null)
164+
Console.WriteLine($"SMS Reference: {smsReference}");
165+
}
160166
break;
161167
default:
162168
Console.WriteLine("Unsupported SMS text format");
163169
break;
164170
}
165-
if (smsReference is not null)
166-
Console.WriteLine($"SMS Reference: {smsReference}");
167171
}
168172
break;
169173
case ConsoleKey.R:

src/HeboTech.ATLib.TestConsole/HeboTech.ATLib.TestConsole.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,15 @@
22

33
<PropertyGroup>
44
<OutputType>Exe</OutputType>
5-
<TargetFrameworks>net6.0;net48</TargetFrameworks>
5+
<TargetFramework>net7.0</TargetFramework>
66
</PropertyGroup>
77

88
<PropertyGroup Condition=" '$(TargetFramework)' == 'net48' ">
99
<LangVersion>9.0</LangVersion>
1010
</PropertyGroup>
1111

1212
<ItemGroup>
13-
<PackageReference Include="System.IO.Ports" Version="6.0.0" />
13+
<PackageReference Include="System.IO.Ports" Version="7.0.0" />
1414
</ItemGroup>
1515

1616
<ItemGroup>

src/HeboTech.ATLib.TestConsole/Program.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ static async Task Main(string[] args)
4646

4747
/* ######## UNCOMMENT THIS SECTION TO USE NETWORK SOCKET ######## */
4848
//using Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
49-
//socket.Connect("192.168.1.81", 7000);
49+
//socket.Connect("192.168.1.144", 7000);
5050
//Console.WriteLine("Network socket opened");
5151
//Stream stream;
5252
//stream = new NetworkStream(socket);

src/HeboTech.ATLib.Tests/CodingSchemes/AnsiTests.cs

Lines changed: 0 additions & 40 deletions
This file was deleted.
Lines changed: 155 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,184 @@
11
using HeboTech.ATLib.CodingSchemes;
2+
using System;
23
using Xunit;
34

45
namespace HeboTech.ATLib.Tests.PDU
56
{
67
public class Gsm7Tests
78
{
9+
[Theory]
10+
[InlineData("41", "41")]
11+
[InlineData("4142", "4121")]
12+
[InlineData("54616461203A29", "D430390CD2A500")]
13+
[InlineData("54686520717569636b2062726f776e20666f78206a756d7073206f76657220746865206c617a7920646f67", "54741914AFA7C76B9058FEBEBB41E6371EA4AEB7E173D0DB5E9683E8E832881DD6E741E4F719")]
14+
public void Pack_returns_packed_bytes(string gsm7Bit, string expected)
15+
{
16+
byte[] result = Gsm7.Pack(Convert.FromHexString(gsm7Bit));
17+
18+
Assert.Equal(Convert.FromHexString(expected), result);
19+
}
20+
21+
[Theory]
22+
[InlineData("41" , "41")]
23+
[InlineData("4121", "4142")]
24+
[InlineData("D430390CD2A500", "54616461203A29")]
25+
[InlineData("54741914AFA7C76B9058FEBEBB41E6371EA4AEB7E173D0DB5E9683E8E832881DD6E741E4F719", "54686520717569636b2062726f776e20666f78206a756d7073206f76657220746865206c617a7920646f67")]
26+
public void Unpack_returns_unpacked_bytes(string gsm7Bit, string expected)
27+
{
28+
byte[] result = Gsm7.Unpack(Convert.FromHexString(gsm7Bit));
29+
30+
Assert.Equal(Convert.FromHexString(expected), result);
31+
}
32+
33+
[Theory]
34+
[InlineData("A", "41")]
35+
[InlineData("AB", "4142")]
36+
[InlineData("The quick brown fox jumps over the lazy dog", "54686520717569636b2062726f776e20666f78206a756d7073206f76657220746865206c617a7920646f67")]
37+
[InlineData("Tada :)", "54616461203A29")]
38+
public void EncodeToBytes_returns_encoded_bytes(string gsm7Bit, string expected)
39+
{
40+
byte[] result = Gsm7.EncodeToBytes(gsm7Bit.ToCharArray());
41+
42+
Assert.Equal(Convert.FromHexString(expected), result);
43+
}
44+
45+
[Theory]
46+
[InlineData("41", "A")]
47+
[InlineData("4142", "AB")]
48+
[InlineData("54686520717569636b2062726f776e20666f78206a756d7073206f76657220746865206c617a7920646f67", "The quick brown fox jumps over the lazy dog")]
49+
[InlineData("54616461203A29", "Tada :)")]
50+
public void DecodeFromBytes_returns_decoded_text(string gsm7Bit, string expected)
51+
{
52+
string result = Gsm7.DecodeFromBytes(Convert.FromHexString(gsm7Bit));
53+
54+
Assert.Equal(expected, result);
55+
}
56+
857
[Theory]
958
[InlineData("A", "41")]
1059
[InlineData("AB", "4121")]
1160
[InlineData("ABC", "41E110")]
1261
[InlineData("Google", "C7F7FBCC2E03")]
1362
[InlineData("SMS Rulz", "D3E61424ADB3F5")]
1463
[InlineData("Hello.", "C8329BFD7601")]
64+
[InlineData("Hello world", "C8329BFD06DDDF723619")]
1565
[InlineData("This is testdata!", "54747A0E4ACF41F4F29C4E0ED3C321")]
1666
[InlineData("The quick brown fox jumps over the lazy dog", "54741914AFA7C76B9058FEBEBB41E6371EA4AEB7E173D0DB5E9683E8E832881DD6E741E4F719")]
1767
[InlineData("Tada :)", "D430390CD2A500")]
18-
public void Encoder_returns_encoded_text(string gsm7Bit, string expected)
68+
[InlineData("hellohello", "E8329BFD4697D9EC37")]
69+
[InlineData("Hi", "C834")]
70+
public void Encode_and_pack_returns_encoded_text(string gsm7Bit, string expected)
71+
{
72+
byte[] result = Gsm7.Pack(Gsm7.EncodeToBytes(gsm7Bit));
73+
74+
Assert.Equal(Convert.FromHexString(expected), result);
75+
}
76+
77+
[Theory]
78+
[InlineData("41", 0, "A")]
79+
[InlineData("4121", 0, "AB")]
80+
[InlineData("C834", 0, "Hi")]
81+
[InlineData("41E110", 0, "ABC")]
82+
[InlineData("C7F7FBCC2E03", 0, "Google")]
83+
[InlineData("D430390CD2A500", 0, "Tada :)")]
84+
[InlineData("D3E61424ADB3F5", 0, "SMS Rulz")]
85+
[InlineData("C8329BFD7601", 0, "Hello.")]
86+
[InlineData("C8329BFD06DDDF723619", 0, "Hello world")]
87+
[InlineData("54747A0E4ACF41F4F29C4E0ED3C321", 0, "This is testdata!")]
88+
[InlineData("54741914AFA7C76B9058FEBEBB41E6371EA4AEB7E173D0DB5E9683E8E832881DD6E741E4F719", 0, "The quick brown fox jumps over the lazy dog")]
89+
[InlineData(
90+
"986F79B90D4AC3E7F53688FC66BFE5A0799A0E0AB7CB741668FC76CFCB637A995E9783C2E4343C3D1FA7DD6750999DA6B340F33219447E83CAE9FABCFD2683E8E536FC2D07A5DDE334394DAEBBE9A03A1DC40E8BDFF232A84C0791DFECB7BC0C6A87CFEE3028CC4EC7EB6117A84A0795DDE936284C06B5D3EE741B642FBBD3E1360B14AFA7E7", 1,
91+
"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis")]
92+
public void Unpack_and_decode_returns_decoded_text(string gsm7Bit, int paddingBits, string expected)
1993
{
20-
string result = Gsm7.Encode(gsm7Bit);
94+
byte[] unpacked = Gsm7.Unpack(Convert.FromHexString(gsm7Bit), paddingBits);
95+
string result = Gsm7.DecodeFromBytes(unpacked);
2196

2297
Assert.Equal(expected, result);
2398
}
2499

25100
[Theory]
26-
[InlineData("41", "A")]
27-
[InlineData("4121", "AB")]
28-
[InlineData("41E110", "ABC")]
29-
[InlineData("C7F7FBCC2E03", "Google")]
30-
[InlineData("D3E61424ADB3F5", "SMS Rulz")]
31-
[InlineData("C8329BFD7601", "Hello.")]
32-
[InlineData("54747A0E4ACF41F4F29C4E0ED3C321", "This is testdata!")]
33-
[InlineData("54741914AFA7C76B9058FEBEBB41E6371EA4AEB7E173D0DB5E9683E8E832881DD6E741E4F719", "The quick brown fox jumps over the lazy dog")]
34-
public void Decoder_returns_decoded_text(string gsm7Bit, string expected)
101+
[InlineData("{", "1B28")]
102+
[InlineData("{}", "1B281B29")]
103+
[InlineData("()", "2829")]
104+
public void EncodeToBytes_returns_encoded_bytes_with_default_extension_table(string gsm7Bit, string expected)
105+
{
106+
byte[] result = Gsm7.EncodeToBytes(gsm7Bit);
107+
108+
Assert.Equal(Convert.FromHexString(expected), result);
109+
}
110+
111+
[Theory]
112+
[InlineData("À", Gsm7.Extension.Portugese, Gsm7.Extension.Portugese, "14")]
113+
[InlineData("Φ", Gsm7.Extension.Portugese, Gsm7.Extension.Portugese, "1B12")]
114+
[InlineData("ΦΣ", Gsm7.Extension.Portugese, Gsm7.Extension.Portugese, "1B121B18")]
115+
public void EncodeToBytes_returns_encoded_bytes_with_extension_table(string gsm7Bit, Gsm7.Extension singleShift, Gsm7.Extension lockingShift, string expected)
116+
{
117+
byte[] result = Gsm7.EncodeToBytes(gsm7Bit, singleShift, lockingShift);
118+
119+
Assert.Equal(Convert.FromHexString(expected), result);
120+
}
121+
122+
[Theory]
123+
[InlineData(new byte[] { 0x1B }, " ")]
124+
[InlineData(new byte[] { 0x1B, 0x28 }, "{")]
125+
[InlineData(new byte[] { 0x1B, 0x28, 0x1B, 0x29 }, "{}")]
126+
[InlineData(new byte[] { 0x28, 0x29 }, "()")]
127+
public void DecodeFromBytes_returns_decoded_text_with_default_extension_table(byte[] gsm7Bit, string expected)
35128
{
36-
string result = Gsm7.Decode(gsm7Bit);
129+
string result = Gsm7.DecodeFromBytes(gsm7Bit);
37130

38131
Assert.Equal(expected, result);
39132
}
133+
134+
[Theory]
135+
[InlineData("14", Gsm7.Extension.Portugese, Gsm7.Extension.Portugese, "À")]
136+
[InlineData("1B", Gsm7.Extension.Portugese, Gsm7.Extension.Portugese, " ")]
137+
[InlineData("1B12", Gsm7.Extension.Portugese, Gsm7.Extension.Portugese, "Φ")]
138+
public void DecodeFromBytes_returns_decoded_text_with_extension_table(string gsm7Bit, Gsm7.Extension singleShift, Gsm7.Extension lockingShift, string expected)
139+
{
140+
string result = Gsm7.DecodeFromBytes(Convert.FromHexString(gsm7Bit), singleShift, lockingShift);
141+
142+
Assert.Equal(expected, result);
143+
}
144+
145+
[Theory]
146+
[InlineData("A", 0, "41")]
147+
[InlineData("Hello world", 0, "C8329BFD06DDDF723619")]
148+
[InlineData("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostru", 0, "CCB7BCDC06A5E1F37A1B447EB3DF72D03C4D0785DB653A0B347EBBE7E531BD4CAFCB4161721A9E9E8FD3EE33A8CC4ED359A079990C22BF41E5747DDE7E9341F4721BFE9683D2EE719A9C26D7DD74509D0E6287C56F791954A683C86FF65B5E06B5C36777181466A7E3F5B00B54A583CAEE741B142683DA6977BA0DB297DDE9709B058AD7D37390FB3DA7CBEB")]
149+
[InlineData("Hello world", 1, "906536FB0DBABFE56C3200")]
150+
[InlineData("Hi", 2, "20D300")]
151+
[InlineData("Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.Ut enim ad minim veniam, quis", 1, "986F79B90D4AC3E7F53688FC66BFE5A0799A0E0AB7CB741668FC76CFCB637A995E9783C2E4343C3D4F8FD3EE33A8CC4ED359A079990C22BF41E5747DDE7E9341F4721BFE9683D2EE719A9C26D7DD74509D0E6287C56F791954A683C86FF65B5E06B5C36777181466A7E3F5B0AB4A0795DDE936284C06B5D3EE741B642FBBD3E1360B14AFA7E700")]
152+
[InlineData(" nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolor", 1, "40EEF79C2EAF9341657C593E4ED3C3F4F4DB0DAAB3D9E1F6F80D6287C56F797A0E72A7E769509D0E0AB3D3F17A1A0E2AE341E53068FC6EB7DFE43768FC76CFCBF17A98EE22D6D37350B84E2F83D2F2BABC0C22BFD96F3928ED06C9CB7079195D7693CBF2341D947683EC6F761D4E0FD3CB207B999DA683CAF37919344EB3D9F53688FC66BFE500")]
153+
[InlineData("e eu fugiat nulla pariatur.Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", 1, "CAA0721D64AE9FD3613AC85D67B3C32078589E0ED3EB7257113F2EC3E9E5BA1C344FBBE9A0F7781C2E8FC374D0B80E4F93C3F4301DE47EBB4170F93B4D2EBBE92CD0BCEEA683D26ED0B8CE868741F17A1AF4369BD3E37418442ECFCBF2BA9B0E6ABFD9EC341D1476A7DBA03419549ED341ECB0F82DAFB75D00")]
154+
public void Encoder_returns_encoded_text_with_padding(string gsm7Bit, int paddingBits, string expected)
155+
{
156+
byte[] result = Gsm7.Pack(Gsm7.EncodeToBytes(gsm7Bit), paddingBits);
157+
158+
Assert.Equal(expected, BitConverter.ToString(result).Replace("-", ""));
159+
}
160+
161+
[Theory]
162+
[InlineData("A")]
163+
[InlineData("AB")]
164+
[InlineData("ABC")]
165+
[InlineData("Google")]
166+
[InlineData("SMS Rulz")]
167+
[InlineData("Hello.")]
168+
[InlineData("Hello world")]
169+
[InlineData("This is testdata!")]
170+
[InlineData("The quick brown fox jumps over the lazy dog")]
171+
[InlineData("Tada :)")]
172+
[InlineData("hellohello")]
173+
[InlineData("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud")]
174+
public void Encode_decode_returns_original_text(string text)
175+
{
176+
byte[] encoded = Gsm7.EncodeToBytes(text);
177+
byte[] packed = Gsm7.Pack(encoded);
178+
byte[] decoded = Gsm7.Unpack(packed);
179+
string result = Gsm7.DecodeFromBytes(decoded);
180+
181+
Assert.Equal(text, result);
182+
}
40183
}
41184
}

src/HeboTech.ATLib.Tests/DTOs/PhoneNumberExtensionsTests.cs

Lines changed: 0 additions & 40 deletions
This file was deleted.

0 commit comments

Comments
 (0)